Comment Installer et Utiliser OpenCV et Tesseract pour l’Extraction de Données d’une Carte d’Identité
Dans cet article, nous allons explorer un cas pratique d’extraction d’informations à partir d’une carte d’identité. Nous allons utiliser Python avec les bibliothèques OpenCV, Tesseract OCR, et quelques autres outils pour extraire la photo et les informations textuelles d’une carte d’identité scannée.
Prérequis
Assurez-vous d’avoir les bibliothèques suivantes installées sur votre environnement Python :
pip install pytesseract
pip install numpy
pip install opencv-python
sudo apt-get install tesseract-ocr
Ces commandes installent respectivement :
- pytesseract : Une interface Python pour Tesseract OCR.
- numpy : Une bibliothèque pour les calculs numériques.
- opencv-python : Une bibliothèque pour le traitement d’images.
- tesseract-ocr : L’outil OCR pour extraire du texte des images.
Le Code Python
Voici un script Python complet pour détecter une photo, l’extraire d’une image de carte d’identité et lire les informations textuelles.
Fonction pour l’extraction de la photo
La fonction extract_face
utilise OpenCV pour détecter une face dans une image :
import cv2
def extract_face(image_path):
"""Detect and extract the face from the ID card image."""
image = cv2.imread(image_path)
if image is None:
print("Error: Unable to load the image. Please check the file path.")
return None
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Load OpenCV's pre-trained face detector
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
if len(faces) == 0:
print("No face detected.")
return None
x, y, w, h = faces[0]
face = image[y:y+h, x:x+w]
cv2.imwrite("extracted_face.jpg", face)
return face
Fonction pour l’extraction de texte
La fonction extract_text
utilise pytesseract pour extraire du texte de l’image de la carte d’identité.
import pytesseract
from pytesseract import Output
import re
def extract_text(image_path):
"""Extract text from the ID card image using Tesseract OCR."""
image = cv2.imread(image_path)
if image is None:
print("Error: Unable to load the image. Please check the file path.")
return {}
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
gray = cv2.medianBlur(gray, 3)
custom_config = r'--oem 3 --psm 6'
text = pytesseract.image_to_string(gray, config=custom_config)
organized_data = {
"Nom": re.search(r'(?i)Nom:\s*([A-Z]+)', text).group(1) if re.search(r'(?i)Nom:\s*([A-Z]+)', text) else "",
"Prénom(s)": re.search(r'(?i)Prénom\(s\):\s*([A-ZÉÊÈ]+)', text).group(1) if re.search(r'(?i)Prénom\(s\):\s*([A-ZÉÊÈ]+)', text) else "",
"Sexe": re.search(r'(?i)Sexe\s*:\s*([A-Z])', text).group(1) if re.search(r'(?i)Sexe\s*:\s*([A-Z])', text) else "",
"Date de naissance": re.search(r'(?i)N\(e\)\sle\s*:\s*(\d{2}[./]\d{2}[./]\d{4})', text).group(1) if re.search(r'(?i)N\(e\)\sle\s*:\s*(\d{2}[./]\d{2}[./]\d{4})', text) else "",
"Ville": re.search(r'(?i)\:\s*([A-Z\s]+\(\d{2}\))', text).group(1) if re.search(r'(?i)\:\s*([A-Z\s]+\(\d{2}\))', text) else "",
"Numéro d'identité": re.search(r'(?i)Ne:\s*(\d+)', text).group(1) if re.search(r'(?i)Ne:\s*(\d+)', text) else "",
"Taille": re.search(r'(?i)Taille:\s*(\d+)', text).group(1) if re.search(r'(?i)Taille:\s*(\d+)', text) else "",
}
return organized_data
Exécution principale
if __name__ == "__main__":
image_path = "id_card.jpg"
print("Extracting face...")
face = extract_face(image_path)
if face is not None:
print("Face extracted and saved as 'extracted_face.jpg'.")
print("\nExtracting text...")
data = extract_text(image_path)
print("\nOrganized Data:")
for key, value in data.items():
print(f"{key}: {value}")
Exemple de Résultats
Si vous exécutez le script sur une carte d’identité, voici un exemple des données extraites :
Extracting face...
Face extracted and saved as 'extracted_face.jpg'.
Extracting text...
Organized Data:
Nom: BERTHIER
Prénom(s):
Sexe: F
Date de naissance:
Ville:
Numéro d'identité: 880692310285
Taille:
ce qui donne un script du genre
import cv2
import pytesseract
from pytesseract import Output
import numpy as np
import re
def extract_face(image_path):
"""Detect and extract the face from the ID card image."""
# Load the image
image = cv2.imread(image_path)
if image is None:
print("Error: Unable to load the image. Please check the file path.")
return None
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Load OpenCV's pre-trained face detector
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# Detect faces
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
if len(faces) == 0:
print("No face detected.")
return None
# Assume the first detected face is the ID photo
x, y, w, h = faces[0]
face = image[y:y+h, x:x+w]
# Save or return the extracted face
cv2.imwrite("extracted_face.jpg", face)
return face
def extract_text(image_path):
"""Extract text from the ID card image using Tesseract OCR and organize it."""
# Load the image
image = cv2.imread(image_path)
if image is None:
print("Error: Unable to load the image. Please check the file path.")
return {}
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Apply preprocessing for better OCR results
gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
gray = cv2.medianBlur(gray, 3)
# Perform OCR
custom_config = r'--oem 3 --psm 6'
text = pytesseract.image_to_string(gray, config=custom_config)
# Organize the extracted text with improved regex
organized_data = {
"Nom": re.search(r'(?i)Nom:\s*([A-Z]+)', text).group(1) if re.search(r'(?i)Nom:\s*([A-Z]+)', text) else "",
"Prénom(s)": re.search(r'(?i)Prénom\(s\):\s*([A-ZÉÊÈ]+)', text).group(1) if re.search(r'(?i)Prénom\(s\):\s*([A-ZÉÊÈ]+)', text) else "",
"Sexe": re.search(r'(?i)Sexe\s*:\s*([A-Z])', text).group(1) if re.search(r'(?i)Sexe\s*:\s*([A-Z])', text) else "",
"Date de naissance": re.search(r'(?i)N\(e\)\sle\s*:\s*(\d{2}[./]\d{2}[./]\d{4})', text).group(1) if re.search(r'(?i)N\(e\)\sle\s*:\s*(\d{2}[./]\d{2}[./]\d{4})', text) else "",
"Ville": re.search(r'(?i)\:\s*([A-Z\s]+\(\d{2}\))', text).group(1) if re.search(r'(?i)\:\s*([A-Z\s]+\(\d{2}\))', text) else "",
"Numéro d'identité": re.search(r'(?i)Ne:\s*(\d+)', text).group(1) if re.search(r'(?i)Ne:\s*(\d+)', text) else "",
"Taille": re.search(r'(?i)Taille:\s*(\d+)', text).group(1) if re.search(r'(?i)Taille:\s*(\d+)', text) else "",
}
return organized_data
if __name__ == "__main__":
# Path to the ID card image
image_path = "id_card.jpg"
print("Extracting face...")
face = extract_face(image_path)
if face is not None:
print("Face extracted and saved as 'extracted_face.jpg'.")
print("\nExtracting text...")
data = extract_text(image_path)
print("\nOrganized Data:")
for key, value in data.items():
print(f"{key}: {value}")
Executions
- Assurez-vous d’avoir installé toutes les bibliothèques nécessaires avec les commandes suivantes :
pip install pytesseract pip install numpy pip install opencv-python sudo apt-get install tesseract-ocr
Placez une image de carte d’identité nommée id_card.jpg
dans le même répertoire que le script.
Exécutez le script :python script.py
Le visage extrait sera enregistré sous le nom extracted_face.jpg
et les données textuelles extraites seront affichées dans la console.