Как извлечь и распознать номер автомобиля с помощью Python? - PullRequest
0 голосов
/ 29 января 2019

Я пытался использовать pytesseract в сотрудничестве с PIL для идентификации регистрационного номера транспортного средства на изображении номерного знака.Но я не могу получить текст с этих изображений.

код:

 from PIL import Image
 from pytesseract import image_to_string

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

Хотя это работает для обычных отсканированных документов, оно не работает для номерных знаков транспортных средств.

Образец изображения 1

enter image description here

Образец изображения 2

enter image description here

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Это работает только для второго изображения :

from PIL import Image, ImageFilter
import pytesseract

img = Image.open('TcjXJ.jpg')
img2 = img.filter(ImageFilter.BLUR)
pixels = img2.load()
width, height = img2.size
x_ = []
y_ = []
for x in range(width):
    for y in range(height):
        if pixels[x, y] == (255, 255, 255):
            x_.append(x)
            y_.append(y)

img = img.crop((min(x_), min(y_),  max(x_), max(y_)))
text = pytesseract.image_to_string(img, lang='eng', config='-c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
print(text)

Вы получили на выходе:

TN 99 F 2378
0 голосов
/ 30 января 2019

Вот примерное представление о том, как вы можете решить свою проблему.Вы можете построить поверх этого.Вам нужно извлечь номерной знак с картинки, а затем отправить изображение на ваш тессеракт.Прочитайте комментарии к коду, чтобы понять, что я пытаюсь сделать.

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()

Вывод - это номерной знак, прикрепленный ниже:

enter image description here

Теперь передайте это обрезанное изображение в ваш тессеракт.

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

Я получаю приведенный ниже вывод для образца изображения, которым вы поделились.

enter image description here

Анализ будет более точным, если вы в перспективе преобразуете изображение номерного знака в прямоугольник ограничительной рамки, а также удалите лишние границы вокруг.Дайте мне знать, если вам тоже нужна помощь.

Приведенный выше код не работает для второго изображения, если оно используется как есть, потому что я фильтрую поиск по полигонам с 4 сторон.Надеюсь, у вас есть идея.

0 голосов
/ 29 января 2019
  1. Вы можете использовать движок OpenVINO , он содержит предварительно подготовленную модель и образец для обнаружения и распознавания пластин.
  2. OpenALPR дляPython.
...