Python - OpenCV pytesseract 未从裁剪后的图像中提取字符串
Python - OpenCV pytesseract not extracting string from cropped image
我有一张图片(已附上),想从表单中提取某些字段。例如姓名 'Sarah'、她的电子邮件地址等。我有感兴趣的区域,它被突出显示,然后被裁剪。出于某种原因,我从图像到字符串的输出显示为空?
所需的输出应该提取数据。请有人能指出我正确的方向吗?
我正在关注这个很棒的上下文教程: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)
您的代码中的问题是以下行:
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'、她的电子邮件地址等。我有感兴趣的区域,它被突出显示,然后被裁剪。出于某种原因,我从图像到字符串的输出显示为空?
所需的输出应该提取数据。请有人能指出我正确的方向吗? 我正在关注这个很棒的上下文教程: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)
您的代码中的问题是以下行:
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)