Получение ограничивающей рамки распознанных слов с помощью python-tesseract
Я использую python-tesseract для извлечения слов из изображения. Это оболочка python для tesseract, которая является кодом 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
Это возвращает только слова, а не их местоположение/размер/ориентацию (или, другими словами, ограничивающее поле, содержащее их) в изображении. Мне было интересно, есть ли способ получить это также
3 ответов
tesseract.GetBoxText()
метод возвращает точное положение каждого символа в массиве.
кроме того, есть опция командной строки tesseract test.jpg result hocr
это создаст result.html
файл с координатами каждого распознанного слова в нем. Но я не уверен, можно ли вызвать его через скрипт python.
используя приведенный ниже код, вы можете получить ограничивающее поле, соответствующее каждому символу.
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)
Python Тессеракт можете сделать это без записи в файл, используя 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)