【问题标题】:Read text below barcode pytesseract python阅读条形码 pytesseract python 下面的文本
【发布时间】:2021-02-11 20:44:09
【问题描述】:

我正在尝试获取图像中条形码下方的数字。我已经用其他一些图像尝试了相同的代码并且工作正常但不适用于该图像 这是图像

这是到目前为止的代码

def readNumber():
    image = cv2.imread(sTemp)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (3,3), 0)
    thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
    opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
    invert = 255 - opening
    data = pytesseract.image_to_string(invert, lang='eng', config='--psm 6 -c tessedit_char_whitelist=0123456789')
    print(data)
    try:
        data  = re.findall('(\d{9})\D', data)[0]
    except:
        data = ''
    return data

我用这条线来使用它

readNumber()

这是另一个例子

这是我保证的最后一个例子

我在第三个示例中尝试了这个,它可以工作

img = cv2.imread("thisimage.png")
blur = cv2.GaussianBlur(img, (3,3), 0)
#gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
txt = pytesseract.image_to_string(blur)
print(txt)

但是我如何采用所有案例来处理这三个案例? 我尝试了这样的代码,但无法实现第三种情况

import pytesseract, cv2, re

def readNumber(img):
    img = cv2.imread(img)
    gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    try:
        txt = pytesseract.image_to_string(gry)
        #txt  = re.findall('(\d{9})\D', txt)[0]
    except:
        thr = cv2.adaptiveThreshold(gry, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 51, 4)
        txt = pytesseract.image_to_string(thr, config="digits")
        #txt  = re.findall('(\d{9})\D', txt)[0]

    return txt

# M5Pr5         191876320
# RWgrP         202131290
# 6pVH4         193832560
print(readNumber('M5Pr5.png'))

【问题讨论】:

    标签: python tesseract


    【解决方案1】:

    您不需要对输入图像进行任何预处理方法或配置。由于图像中没有伪影。

    import cv2
    import pytesseract
    
    img = cv2.imread("RWgrP.png")
    gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    txt = pytesseract.image_to_string(gry)
    print(txt)
    

    结果:

    202131290
    

    我的pytesseract版本是4.1.1

    更新-1


    第二张图片需要preprocessing

    如果你申请adaptive-thresholding

    但输出也包含不需要的字符。因此,如果您将配置设置为数字,结果将是:

    193832560
    

    更新-2


    对于第三张图片,需要更改自适应方式,使用ADAPTIVE_THRESH_MEAN_C会导致:

    191876320
    

    其他都一样。

    代码:

    import cv2
    import pytesseract
    
    img = cv2.imread("6pVH4.png")
    gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    thr = cv2.adaptiveThreshold(gry, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 51, 4)
    txt = pytesseract.image_to_string(thr, config="digits")
    print(txt)
    cv2.imshow("thr", thr)
    cv2.waitKey(0)
    

    【讨论】:

    • 非常感谢。我尝试了代码,但我得到了202131280 而不是202131290。如何改进?
    • 当我编辑这行txt = pytesseract.image_to_string(gry, lang='eng', config='--psm 6 --oem -c tessedit_char_whitelist=0123456789')时,我得到了正确的结果。非常感谢。
    • 最新版本是0.3.7。 4.1.1是print(pytesseract.get_tesseract_version())的输出
    • 对我来说没问题,尽可能多地询问,您需要为第三张图像更改adaptiveMethod。查看Update-2下的答案
    • 问题是您需要一种基于深度学习的方法。对输入图像的所有变化保持不变的方法。也许你应该谷歌east-text-detector
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多