簡體   English   中英

無法正確識別車牌(Python、OpenCv、Tesseract)

[英]can't recognize correctly license plate (Python, OpenCv, Tesseract)

我正在嘗試識別車牌,但出現錯誤/未讀取字符等錯誤

這是每個步驟的可視化:

通過顏色閾值 + 變形關閉獲得掩碼

顏色閾值變形關閉

過濾以綠色突出顯示的車牌輪廓

鄉村

將板輪廓粘貼到空白蒙版上

輪廓

Tesseract OCR 的預期結果

英國石油公司 1309 GD

但我得到的結果是

英國石油公司 1309 6D

我嘗試將輪廓切成 3 片

在此處輸入圖像描述

在此處輸入圖像描述 在此處輸入圖像描述

是的,它正在工作,但是如果我將差異圖像插入此方法,則某些圖像無法識別,例如這個

在此處輸入圖像描述

字母 N 無法識別,但如果使用第一種方法,它正在工作

在此處輸入圖像描述

這是代碼

import numpy as np
import pytesseract
import cv2
import os

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
image_path = "data"

for nama_file in sorted(os.listdir(image_path)):
    print(nama_file)
    # Load image, create blank mask, convert to HSV, define thresholds, color threshold
    I = cv2.imread(os.path.join(image_path, nama_file))
    dim = (500, 120)
    I = cv2.resize(I, dim, interpolation = cv2.INTER_AREA)
    (thresh, image) = cv2.threshold(I, 127, 255, cv2.THRESH_BINARY)
    result = np.zeros(image.shape, dtype=np.uint8)
    result = 255 - result
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    lower = np.array([0,0,0])
    upper = np.array([179,100,130])
    mask = cv2.inRange(hsv, lower, upper)
    slices = []
    slices.append(result.copy())
    slices.append(result.copy())
    slices.append(result.copy())
    i = 0
    j = 0
    xs = []

    # Perform morph close and merge for 3-channel ROI extraction
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
    close = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, iterations=1)
    extract = cv2.merge([close,close,close])

    # Find contours, filter using contour area, and extract using Numpy slicing
    cnts = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    boundingBoxes = [cv2.boundingRect(c) for c in cnts]
    (cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),
    key=lambda b:b[1][0], reverse=False))
    for c in cnts:
        x,y,w,h = cv2.boundingRect(c)
        area = w * h
        ras = format(w / h, '.2f')
        if h >= 40 and h <= 70 and w >= 10 and w <= 65 and float(ras) <= 1.3:
            cv2.rectangle(I, (x, y), (x + w, y + h), (36,255,12), 3)
            result[y:y+h, x:x+w] = extract[y:y+h, x:x+w]
            # Slice
            xs.append(x)
            if i > 0:
                if (xs[i] - xs[i-1]) > 63:
                    j = j+1
            i = i + 1
            slices[j][y:y+h, x:x+w] = extract[y:y+h, x:x+w]

    # Split throw into Pytesseract
    j=0
    for s in slices:
        cv2.imshow('result', s)
        cv2.waitKey()
        if j != 1 :
            data = pytesseract.image_to_string(s, lang='eng',config='--psm 6 _char_whitelist=ABCDEFGHIJKLMNOPQRTUVWXYZ')
        else :
            data = pytesseract.image_to_string(s, lang='eng',config='--psm 6 _char_whitelist=1234567890')
        print(data)

    # Block throw into Pytesseract
    data = pytesseract.image_to_string(result, lang='eng',config='--psm 6')
    print(data)

    cv2.imshow('image', I)
    cv2.imshow('close', close)
    cv2.imshow('extract', extract)
    cv2.imshow('result', result)
    cv2.waitKey()

也許有人知道為什么會發生這種情況以及應該怎么做?

提前致謝

我嘗試了很多事情並找到了某種解決方案:

應用擴張形態操作使字母變細:

# Split throw into Pytesseract
j=0
for s in slices:
    cv2.imshow('result', s)
    cv2.waitKey(1)
    if j != 1:
        data = pytesseract.image_to_string(s, config="-c tessedit"
                                                      "_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
                                                      " --psm 6"
                                                      " ")


        if data=='':            
            s = cv2.dilate(s, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)))
            cv2.imshow('cv2.dilate(s)', s)
            cv2.waitKey(1)
            data = pytesseract.image_to_string(s, config="-c tessedit"
                                                         "_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
                                                         " --psm 6"
                                                         " ")
    else:
        pytesseract.pytesseract.tessedit_char_whitelist = '1234567890'
        data = pytesseract.image_to_string(s, lang='eng',config='--psm 6 _char_whitelist=1234567890')

    print(data)

這種行為非常奇怪。
有很多抱怨,建議的解決方案不起作用。

例如,請參閱以下帖子: Tesseract 無法識別單個字符

至少我學會了如何使用_char_whitelist選項(你需要添加-c tessedit )......

我想這個解決方案不夠健壯(可能是偶然的)。
我認為當前版本的 Tesseract 沒有簡單的解決方案。

我可以使用 ubuntu shell 中的簡單命令立即解碼板。 但為了做到這一點,您必須將 tesseract 從版本 4 升級到 5。

牌照

tesseract a364k.png stdout -l eng --oem 3 --psm 7 -c tessedit_char_whitelist="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "
BP 1309 GD

在您的代碼中,您可以將其添加到配置中

-l eng --oem 3 --psm 7 -c tessedit_char_whitelist="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM