Getting the bounding box of the recognized words using python-tesseract Getting the bounding box of the recognized words using python-tesseract python python

Getting the bounding box of the recognized words using python-tesseract


Use pytesseract.image_to_data()

import pytesseractfrom pytesseract import Outputimport cv2img = 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)

Among the data returned by pytesseract.image_to_data():

  • left is the distance from the upper-left corner of the boundingbox, to the left border of the image.
  • top is the distance from the upper-left corner of the bounding box,to the top border of the image.
  • width and height are the width and height of the bounding box.
  • conf is the model's confidence for the prediction for the word within that bounding box. If conf is -1, that means that the corresponding bounding box contains a block of text, rather than just a single word.

The bounding boxes returned by pytesseract.image_to_boxes() enclose letters so I believe pytesseract.image_to_data() is what you're looking for.


tesseract.GetBoxText() method returns the exact position of each character in an array.

Besides, there is a command line option tesseract test.jpg result hocr that will generate a result.html file with each recognized word's coordinates in it. But I'm not sure whether it can be called through python script.


Python tesseract can do this without writing to file, using the image_to_boxes function:

import cv2import pytesseractfilename = 'image.png'# read the image and get the dimensionsimg = cv2.imread(filename)h, w, _ = img.shape # assumes color image# run tesseract, returning the bounding boxesboxes = pytesseract.image_to_boxes(img) # also include any config options you use# draw the bounding boxes on the imagefor 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 keypresscv2.imshow(filename, img)cv2.waitKey(0)