2
votes

Comment extraire et reconnaître le numéro de plaque du véhicule avec Python?

J'ai essayé d'utiliser pytesseract en collaboration avec PIL pour identifier le numéro d'immatriculation du véhicule à partir de l'image de la plaque d'immatriculation. Mais je ne suis pas en mesure d'obtenir le texte de ces images.

le code:

 from PIL import Image
 from pytesseract import image_to_string

 img= Image.open('D://carimage1')
 text = image_to_string(img)
 print(text)

Bien que cela fonctionne pour les documents numérisés normaux, cela ne fonctionne pas pour les plaques d'immatriculation des véhicules .

Exemple d'image 1

entrez la description de l'image ici

Exemple d'image 2

entrez description de l'image ici


0 commentaires

3 Réponses :


0
votes
  1. Vous pouvez utiliser Moteur OpenVINO , il contient modèle et échantillon pré-entraînés pour la détection et la reconnaissance des plaques.
  2. OpenALPR pour Python.

2 commentaires

essaiera ces derniers et vous le fera savoir. Nuzhny, avez-vous déjà essayé ces bibliothèques?


Oui, mais avec l'API C ++



1
votes

Celui-ci ne fonctionne que pour la deuxième image :

TN 99 F 2378


1 commentaires

Je reçois TNSSF 2378



1
votes

Voici une idée approximative de la manière dont vous pouvez résoudre votre problème. Vous pouvez construire dessus. Vous devez extraire la plaque d'immatriculation de l'image, puis envoyer l'image à votre tesseract. Lisez les commentaires du code pour comprendre ce que j'essaye de faire.

gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,2)
text = pytesseract.image_to_string(roi)
print text

Le résultat est la plaque d'immatriculation ci-dessous:

 entrez la description de l'image ici

Passez maintenant cette image recadrée dans votre tesseract.

import numpy as np
import cv2
import pytesseract
import matplotlib.pyplot as plt

img = cv2.imread('/home/muthu/Documents/3r9OQ.jpg')
#convert my image to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#perform adaptive threshold so that I can extract proper contours from the image
#need this to extract the name plate from the image. 
thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,2)
contours,h = cv2.findContours(thresh,1,2)

#once I have the contours list, i need to find the contours which form rectangles.
#the contours can be approximated to minimum polygons, polygons of size 4 are probably rectangles
largest_rectangle = [0,0]
for cnt in contours:
    approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True)
    if len(approx)==4: #polygons with 4 points is what I need.
        area = cv2.contourArea(cnt)
        if area > largest_rectangle[0]:
            #find the polygon which has the largest size.
            largest_rectangle = [cv2.contourArea(cnt), cnt, approx]

x,y,w,h = cv2.boundingRect(largest_rectangle[1])
#crop the rectangle to get the number plate.
roi=img[y:y+h,x:x+w]
#cv2.drawContours(img,[largest_rectangle[1]],0,(0,0,255),-1)
plt.imshow(roi, cmap = 'gray')
plt.show()

Je reçois la sortie ci-dessous pour l'exemple d'image que vous avez partagé.

 entrez la description de l'image ici

L'analyse sera plus précise si vous transformez en perspective l'image de votre plaque d'immatriculation en rectangle de la boîte englobante et supprimez également les bordures supplémentaires autour. Faites-moi savoir si vous avez également besoin d'aide.

Le code ci-dessus ne fonctionne pas pour la deuxième image s'il est utilisé tel quel, car je filtre la recherche sur des polygones à 4 côtés. J'espère que vous avez l'idée.


1 commentaires

Merci d'avance, pouvez-vous s'il vous plaît guider ce qui devrait être changé pour la première image ou toute autre image?