Распознавание символов с номерного знака с помощью opencv python

Я работаю над проектом по распознаванию символов с номерного знака с помощью opencv python. У меня есть это изображение:

Я пробовал с tesseract и результат: 7G285274-AF А то я уже и не знаю что делать если кто знает подскажите пожалуйста

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

import numpy as np
import cv2
from PIL import Image
import pytesseract 

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'


def ratioCheck(area, width, height):
    ratio = float(width) / float(height)
    if ratio < 1:
        ratio = 1 / ratio
    if (area < 1063.62 or area > 73862.5) or (ratio < 3 or ratio > 6):
        return False
    return True
    



def ratio_and_rotation(rect):
    (x, y), (width, height), rect_angle = rect
    if (width>height):
        angle = -rect_angle
    else:
        angle = 90 + rect_angle
    if angle>15:
         return False
    if height == 0 or width == 0:
        return False
    area = height*width
    if not ratioCheck(area,width,height):
        return False
    else:
        return True


def clean2_plate(plate):
    gray_img = cv2.cvtColor(plate, cv2.COLOR_BGR2GRAY)
    _, thresh = cv2.threshold(gray_img, 110, 255, cv2.THRESH_BINARY)
    if cv2.waitKey(0) & 0xff == ord('q'):
        pass
    num_contours,hierarchy = cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    if num_contours:
        contour_area = [cv2.contourArea(c) for c in num_contours]
        max_cntr_index = np.argmax(contour_area)
        max_cnt = num_contours[max_cntr_index]
        max_cntArea = contour_area[max_cntr_index]
        x,y,w,h = cv2.boundingRect(max_cnt)
        if not ratioCheck(max_cntArea,w,h):
            return plate,None
        final_img = thresh[y:y+h, x:x+w]
        return final_img,[x,y,w,h]
    else:
        return plate, None
        

def isMaxWhite(plate):
    avg = np.mean(plate)
    if (avg>=115):
        return True
    else:
         return False
         

img = cv2.imread("car.jpg")
cv2.imshow("input",img)
img2 = cv2.GaussianBlur(img, (3,3), 0)
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
img2 = cv2.Sobel(img2,cv2.CV_8U,1,0,ksize=3)   
_,img2 = cv2.threshold(img2,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
element = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=(17, 3))
morph_img_threshold = img2.copy()
cv2.morphologyEx(src=img2, op=cv2.MORPH_CLOSE, kernel=element, dst=morph_img_threshold)
num_contours, hierarchy= cv2.findContours(morph_img_threshold,mode=cv2.RETR_EXTERNAL,method=cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img2, num_contours, -1, (0,255,0), 1)



for i,cnt in enumerate(num_contours):

    min_rect = cv2.minAreaRect(cnt)

    if ratio_and_rotation(min_rect):
        x,y,w,h = cv2.boundingRect(cnt)
        plate_img = img[y:y+h,x:x+w]
        print("Number  identified number plate...")
        cv2.imshow("num plate image",plate_img)
        if (isMaxWhite(plate_img)):
            clean_plate, rect = clean2_plate(plate_img)
            if rect:
                fg=0
                x1,y1,w1,h1 = rect
                x,y,w,h = x+x1,y+y1,w1,h1
                plate_im = Image.fromarray(clean_plate)
                text = pytesseract.image_to_string(plate_im, lang='eng', config='--psm 7 --oem 3')
                print("Number  Detected Plate Text : ",text)





cv2.waitKey()

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

Pygirl 16.12.2020 19:02

Поделитесь своим кодом opencv! Мы могли бы помочь

Prayson W. Daniel 16.12.2020 19:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
1 257
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте easyocr. Он использует модели глубокого обучения:

# install using python -m pip install easyocr

import easyocr

# create reader
reader = easyocr.Reader(['en'])

# read characters 
img = "https://i.stack.imgur.com/2Kzu8.png"

characters = reader.readtext(img, detail=0)
print(characters)
# ['ZG', '8524AF']

Смотрите документацию для более подробной информации, параметров и языков

Обновление и результаты от Colab

Чтобы избежать захвата символа отсутствия номерного знака, используйте параметр белого списка

#Narrowing characters 
import string

ALLOWED_LIST = string.ascii_uppercase+string.digits
characters = reader.readtext(img, detail=0, allowlist=ALLOWED_LIST )
print(characters)
# ['ZG', '8524AF']

Мои результаты из Google Colab

Я пробовал с easyocr, он работает намного лучше, но теперь результат [7G=8524 AF]

Arife Ljutviovska 16.12.2020 21:45

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

Prayson W. Daniel 16.12.2020 21:53

Есть параметр allowlist, который мы можем установить, чтобы разрешить только значение в platenr! - jaided.ai/easyocr/documentation

Prayson W. Daniel 16.12.2020 22:04

Теперь он работает. Я пробовал разные алгоритмы обнаружения номерных знаков, этот не очень хорошо подходил для моих фотографий. Большое спасибо :)))

Arife Ljutviovska 17.12.2020 16:39

Другие вопросы по теме