Aller au contenu

Comment Installer et Utiliser OpenCV et Tesseract pour l’Extraction de Données d’une Carte d’Identité FR

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

  1. 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.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *