我正在使用python-tesseract从图像中提取单词。这是tesseract的python包装器,它是一个OCR代码。
我使用以下代码获取字词:
import tesseract
api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_DEFAULT)
api.SetVariable("tessedit_char_whitelist", "0123456789abcdefghijklmnopqrstuvwxyz")
api.SetPageSegMode(tesseract.PSM_AUTO)
mImgFile = "test.jpg"
mBuffer=open(mImgFile,"rb").read()
result = tesseract.ProcessPagesBuffer(mBuffer,len(mBuffer),api)
print "result(ProcessPagesBuffer)=",result
这仅返回图像中的单词而不是它们的位置/大小/方向(或者换句话说,包含它们的边界框)。我想知道是否有任何方法可以获得它
答案 0 :(得分:14)
tesseract.GetBoxText()
方法返回数组中每个字符的确切位置。
此外,还有一个命令行选项tesseract test.jpg result hocr
,它将生成一个result.html
文件,其中包含每个已识别的单词的坐标。但我不确定它是否可以通过python脚本调用。
答案 1 :(得分:14)
使用pytesseract.image_to_data()
import pytesseract
from pytesseract import Output
import cv2
img = cv2.imread('image.jpg')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
n_boxes = len(d['level'])
for i in range(n_boxes):
(x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('img', img)
cv2.waitKey(0)
在pytesseract.image_to_data()
返回的数据中:
left
是距边界左上角的距离
框,位于图像的左边框。top
是距边界框左上角的距离,
到图片的顶部边框。width
和height
是边界框的宽度和高度。conf
是模型对该边界框中单词的预测的置信度。如果conf
为-1,则意味着相应的边界框包含一个文本块,而不是一个单词。 pytesseract.image_to_boxes()
返回的边界框将字母括起来,因此我相信pytesseract.image_to_data()
是您要查找的内容。
答案 2 :(得分:7)
Python tesseract无需使用image_to_boxes
函数写入文件即可完成此操作:
import cv2
import pytesseract
filename = 'image.png'
# read the image and get the dimensions
img = cv2.imread(filename)
h, w, _ = img.shape # assumes color image
# run tesseract, returning the bounding boxes
boxes = pytesseract.image_to_boxes(img) # also include any config options you use
# draw the bounding boxes on the image
for b in boxes.splitlines():
b = b.split(' ')
img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2)
# show annotated image and wait for keypress
cv2.imshow(filename, img)
cv2.waitKey(0)
答案 3 :(得分:6)
使用以下代码,您可以获得与每个字符对应的边界框。
import csv
import cv2
from pytesseract import pytesseract as pt
pt.run_tesseract('bw.png', 'output', lang=None, boxes=True, config="hocr")
# To read the coordinates
boxes = []
with open('output.box', 'rb') as f:
reader = csv.reader(f, delimiter = ' ')
for row in reader:
if(len(row)==6):
boxes.append(row)
# Draw the bounding box
img = cv2.imread('bw.png')
h, w, _ = img.shape
for b in boxes:
img = cv2.rectangle(img,(int(b[1]),h-int(b[2])),(int(b[3]),h-int(b[4])),(255,0,0),2)
cv2.imshow('output',img)
答案 4 :(得分:2)
在lennon310下可以发表评论,但没有足够的声誉来发表评论...
要在python脚本中运行他的命令行命令tesseract test.jpg result hocr
:
from subprocess import check_call
tesseractParams = ['tesseract', 'test.jpg', 'result', 'hocr']
check_call(tesseractParams)
答案 5 :(得分:0)
上面已经回答了一些可以与pytesseract一起使用的示例,但是要使用tesserocr python库,您可以使用下面给出的代码来查找单个单词及其边界框:-
with PyTessBaseAPI(psm=6, oem=1) as api:
level = RIL.WORD
api.SetImageFile(imagePath)
api.Recognize()
ri = api.GetIterator()
while(ri.Next(level)):
word = ri.GetUTF8Text(level)
boxes = ri.BoundingBox(level)
print(word,"word")
print(boxes,"coords")
答案 6 :(得分:0)
要获取单词周围的边界框,请执行以下操作:
import cv2
import pytesseract
img = cv2.imread('/home/gautam/Desktop/python/ocr/SEAGATE/SEAGATE-01.jpg')
from pytesseract import Output
d = pytesseract.image_to_data(img, output_type=Output.DICT)
n_boxes = len(d['level'])
for i in range(n_boxes):
if(d['text'][i] != ""):
(x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imwrite('result.png', img)