【问题标题】:Reading license plate from image using OpenCV Python and Tesseract使用 OpenCV Python 和 Tesseract 从图像中读取车牌
【发布时间】:2019-12-29 15:31:23
【问题描述】:

我有一个问题,因为我有单独的照片注册。现在我想从照片中获取注册号。不幸的是,我编写的代码的效率非常低,我想寻求帮助以提高效率。有什么建议吗?

第一阶段,照片是这样的

然后将照片转换为灰色,只有黑色对比

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# define range of black color in HSV
lower_val = np.array([0,0,0])
upper_val = np.array([179,100,130])

# Threshold the HSV image to get only black colors
mask = cv2.inRange(hsv, lower_val, upper_val)

收到

我可以添加或做些什么来提高计划的有效性。程序有没有办法检索注册?这有帮助吗

configr = ('-l eng --oem 1 --psm 6-c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')

text = pytesseract.image_to_string(mask,lang='eng', config=configr)

print(text)

【问题讨论】:

    标签: python opencv image-processing computer-vision tesseract


    【解决方案1】:

    这是一种方法:

    1. 颜色阈值提取黑色文本。我们加载图像,转换为HSV颜色空间,定义上下颜色范围,并使用cv2.inRange()进行颜色阈值并获得二进制面具

    2. 执行形态学运算。 创建一个内核并执行变形接近以填充轮廓中的孔。

    3. 过滤车牌轮廓。查找轮廓并使用边界矩形区域进行过滤。如果轮廓通过此过滤器,我们将提取 ROI 并将其粘贴到新的空白蒙版上。

    4. 使用 Pytesseract 进行 OCR。我们反转图像,使所需的文本为黑色,然后将其放入 Pytesseract。


    这是每个步骤的可视化:

    通过颜色阈值 + 变形关闭获得蒙版

    过滤以绿色突出显示的车牌轮廓

    将板轮廓粘贴到空白蒙版上

    为 Tesseract 准备的倒置图像

    Tesseract OCR 的结果

    PZ 689LR

    代码

    import numpy as np
    import pytesseract
    import cv2
    
    pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
    
    # Load image, create blank mask, convert to HSV, define thresholds, color threshold
    image = cv2.imread('1.png')
    result = np.zeros(image.shape, dtype=np.uint8)
    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)
    
    # 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]
    for c in cnts:
        x,y,w,h = cv2.boundingRect(c)
        area = w * h
        if area < 5000 and area > 2500:
            cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 3)
            result[y:y+h, x:x+w] = extract[y:y+h, x:x+w] 
    
    # Invert image and throw into Pytesseract
    invert = 255 - result
    data = pytesseract.image_to_string(invert, lang='eng',config='--psm 6')
    print(data)
    
    cv2.imshow('image', image)
    cv2.imshow('close', close)
    cv2.imshow('result', result)
    cv2.imshow('invert', invert)
    cv2.waitKey()
    

    【讨论】:

      猜你喜欢
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 2021-04-10
      • 2023-03-02
      • 2020-07-24
      相关资源
      最近更新 更多