进行OCR以识别卡车/汽车或其他车辆上写的文字

时间:2017-02-04 08:33:37

标签: computer-vision ocr tesseract python-tesseract

我是计算机视觉领域的新手。

我正在尝试使用Tesseract来检测卡车侧面的数字。

Image of a truck taken from Wikipedia

因此,对于此示例,我希望将CMA CGM视为输出。

我通过命令行将此图像输入Tesseract

tesseract image.JPG out -psm 6

但它产生了一个空白文件。

然后我阅读了Tesserocr的文档(Tesseract的python包装器),并尝试了以下代码

with PyTessBaseAPI() as api:
    api.SetImage(image)
    boxes = api.GetComponentImages(RIL.TEXTLINE, True)
    print 'Found {} textline image components.'.format(len(boxes))
    for i, (im, box, _, _) in enumerate(boxes):
        # im is a PIL image object
        # box is a dict with x, y, w and h keys
        api.SetRectangle(box['x'], box['y'], box['w'], box['h'])
        ocrResult = api.GetUTF8Text()
        conf = api.MeanTextConf()
        print (u"Box[{0}]: x={x}, y={y}, w={w}, h={h}, "
               "confidence: {1}, text: {2}").format(i, conf, ocrResult, **box)

再次无法读取图像中的任何字符。

我的问题是我该如何解决这个问题? (我不是在寻找一个现成的代码,但是如何解决这个问题的方法)。

我是否需要使用示例图像训练tesseract,或者我是否可以使用现有库编写代码以某种方式检测卡车的坐标并尝试仅在卡车的边界内进行OCR?

2 个答案:

答案 0 :(得分:0)

Tesseract期望纯文档图像,但图像中包含非文档对象。在将其提供给Tesseract-OCR之前,您需要一个复杂的分割(然后可能是一些图像处理)过程。

答案 1 :(得分:0)

我有一个三步解决方案

您可以使用范围来获取图像的一部分。

  • 例如,如果您选择
    • 高度范围为:从(int(h/4) + 40int(h/2)-20)
    • 宽度范围为:从 int(w/2)int((w*3)/4)
<头>
结果
参与 enter image description here
高斯 enter image description here
阈值 enter image description here
Pytesseract CMA CGM

代码:


import cv2
import pytesseract

img = cv2.imread('YizU3.jpg')
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(h, w) = gry.shape[:2]
gry = gry[int(h/4) + 40:int(h/2)-20, int(w/2):int((w*3)/4)]
blr = cv2.GaussianBlur(gry, (3, 3), 0)
thr = cv2.threshold(gry, 128, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
txt = pytesseract.image_to_string(thr)
print(txt)
cv2.imshow("thr", thr)
cv2.waitKey(0)