【问题标题】:How to extract and recognize the vehicle plate number with Python?如何用Python提取和识别车牌号?
【发布时间】:2019-06-22 11:10:03
【问题描述】:

我曾尝试使用 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

示例图片 2

【问题讨论】:

    标签: python machine-learning computer-vision ocr python-tesseract


    【解决方案1】:

    这里有一个关于如何解决问题的粗略想法。你可以在它之上构建。您需要从图像中提取车牌,然后将图像发送到您的 tesseract。阅读代码 cmets 以了解我想要做什么。

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

    输出是车牌如下:

    现在将这个裁剪后的图像传递到您的 tesseract 中。

    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
    

    我得到您共享的示例图像的以下输出。

    如果您将车牌图像透视转换为边界框矩形并删除周围的额外边框,则解析将更加准确。如果您也需要这方面的帮助,请告诉我。

    如果按原样使用,上面的代码不适用于第二张图像,因为我将搜索过滤为具有 4 个边的多边形。希望你明白了。

    【讨论】:

    • 在此先感谢,您能否指导一下第一张图片或任何其他图片应该更改什么?
    【解决方案2】:

    这个只适用于second image

    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
    

    【讨论】:

    • 我收到 TNSSF 2378
    【解决方案3】:
    1. 您可以使用OpenVINO engine,它包含pretrained model and sample 用于车牌检测和识别。
    2. OpenALPR 用于 Python。

    【讨论】:

    • 将尝试这些并让您知道。 Nuzhny,你以前用过这些库吗?
    • 是的,但使用 C++ API
    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 2013-10-16
    • 2021-03-27
    • 2020-04-18
    • 2014-11-04
    • 2014-12-31
    相关资源
    最近更新 更多