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
Exemple d'image 2
3 Réponses :
essaiera ces derniers et vous le fera savoir. Nuzhny, avez-vous déjà essayé ces bibliothèques?
Oui, mais avec l'API C ++
Celui-ci ne fonctionne que pour la deuxième image :
TN 99 F 2378
Je reçois TNSSF 2378
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:
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é.
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.
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?