【问题标题】:Python - OpenCV pytesseract not extracting string from cropped imagePython - OpenCV pytesseract 不从裁剪图像中提取字符串
【发布时间】:2021-01-24 17:19:34
【问题描述】:

我有一张图片(附加)并想从表单中提取某些字段。例如名字“莎拉”、她的电子邮件地址等。我有感兴趣的区域,它被突出显示,然后被裁剪。出于某种原因,我从图像到字符串的输出显示为空?

所需的输出应提取数据。请有人能指出我正确的方向吗? 我正在关注这个很棒的上下文教程:https://www.youtube.com/watch?v=cUOcY9ZpKxw

['', '', '', '', '', '']

代码如下:


import cv2
import numpy as np
import pytesseract
import os
pytesseract.pytesseract.tesseract_cmd = r'Tesseract-OCR\tesseract.exe'

imgQ = cv2.imread('sarah.png')

#cv2.imshow('output',imgQ)
#cv2.waitKey(0)

roi = [[(98, 984), (680, 1074), 'text', 'Name'],
       [(740, 980), (1320, 1078), 'text', 'Phone'],
       [(100, 1418), (686, 1518), 'text', 'Email'],
       [(740, 1416), (1318, 1512), 'text', 'ID'],
       [(110, 1598), (676, 1680), 'text', 'City'],
       [(748, 1592), (1328, 1686), 'text', 'Country']]

myData=[]
for x,r in enumerate(roi):
        #highlighted the regions
        cv2.rectangle(imgQ, (r[0][0],r[0][1]),(r[1][0],r[1][1]),(0,255,0),cv2.FILLED)
        imgShow = cv2.addWeighted(imgQ,0.99,imgQ,0.1,0)
        #crop regions
        imgCrop = imgShow[r[0][1]:r[1][1], r[0][0]:r[1][0]]
        cv2.imshow(str(x),imgCrop)
        if r[2] == 'text':

            print('{} :{}'.format(r[3],pytesseract.image_to_string(imgCrop)))
            myData.append(pytesseract.image_to_string(imgCrop))
print(myData)    
            

【问题讨论】:

    标签: python python-3.x opencv tesseract pdf-extraction


    【解决方案1】:

    您的代码中的问题是以下行:

    cv2.rectangle(img, (r[0][0], r[0][1]), (r[1][0], r[1][1]), (0, 255, 0), cv2.FILLED)
    
    • 此行执行什么?

    在给定图像中找到 roi 并用绿色填充。喜欢:

    那么你正试图从这个绿色矩形中读取数据enumerate(roi) 次。


    • 第二,为什么imgShow = cv2.addWeighted(img, 0.99, img, 0.1, 0)

    • 第三imgCrop = imgShow[r[0][1]:r[1][1], r[0][0]:r[1][0]]

    我们从img 裁剪怎么样?

    • ..

    输出是

    Name :Sarah
    
    Phone :+ (00) 765-43-21
    
    Email :sarah@abc.com
    
    ID :1356856
    
    City :London
    
    Country :United Kingdom
    

    代码:


    import cv2
    from pytesseract import image_to_string
    
    img = cv2.imread("hzt5U.png")
    # gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # thr = cv2.adaptiveThreshold(gry, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 21, 21)
    # txt = image_to_string(thr, config="--psm 6")
    # print(txt)
    
    roi = [[(98, 984), (680, 1074), 'text', 'Name'],
           [(740, 980), (1320, 1078), 'text', 'Phone'],
           [(100, 1418), (686, 1518), 'text', 'Email'],
           [(740, 1416), (1318, 1512), 'text', 'ID'],
           [(110, 1598), (676, 1680), 'text', 'City'],
           [(748, 1592), (1328, 1686), 'text', 'Country']]
    
    my_data = []
    
    for x, r in enumerate(roi):
        # highlighted the regions
        # cv2.rectangle(img, (r[0][0], r[0][1]), (r[1][0], r[1][1]), (0, 255, 0), cv2.FILLED)
        # imgShow = cv2.addWeighted(img, 0.99, img, 0.1, 0)
    
        # crop regions
        # imgCrop = imgShow[r[0][1]:r[1][1], r[0][0]:r[1][0]]
        imgCrop = img[r[0][1]:r[1][1], r[0][0]:r[1][0]]
        cv2.imwrite("/Users/ahx/Desktop/res{}.png".format(x), imgCrop)
        cv2.imshow(str(x), imgCrop)
        cv2.waitKey(0)
    
        if r[2] == 'text':
            print('{} :{}'.format(r[3], image_to_string(imgCrop)))
            my_data.append(image_to_string(imgCrop))
    
    # print(my_data)
    

    【讨论】:

    • 不确定我是否解释清楚,但我只想从框中提取文本,所以名称 Sarah,或电话号码、电子邮件地址等,这就是我定义 roi 的原因,但是出于某种原因我无法提取它。
    • 现在我明白了。更新了我的答案。
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    相关资源
    最近更新 更多