Obtención del cuadro delimitador de las palabras reconocidas mediante python-tesseract

Estoy usando python-tesseract para extraer palabras de una imagen. Esta es una envoltura de python para tesseract que es un código OCR.

Estoy usando el siguiente código para obtener las palabras:

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 

Esto devuelve solo las palabras y no su ubicación / tamaño / orientación (o, en otras palabras, un cuadro delimitador que las contiene) en la imagen. Me preguntaba si hay alguna manera de conseguir eso también

tesseract.GetBoxText() método tesseract.GetBoxText() devuelve la posición exacta de cada carácter en una matriz.

Además, hay una opción de línea de comando tesseract test.jpg result hocr que generará un archivo result.html con las coordenadas de cada palabra reconocida en él. Pero no estoy seguro de si se puede llamar a través de un script de Python.

Usando el siguiente código, puede obtener el cuadro delimitador correspondiente a cada personaje.

 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) 

Utilice 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) 

Entre los datos devueltos por pytesseract.image_to_data() :

  • left es la distancia desde la esquina superior izquierda del cuadro delimitador, hasta el borde izquierdo de la imagen.
  • top es la distancia desde la esquina superior izquierda del cuadro delimitador hasta el borde superior de la imagen.
  • width y height son el ancho y alto del cuadro delimitador.
  • conf es la confianza del modelo para la predicción de la palabra dentro de ese cuadro delimitador. Si conf es -1, eso significa que el cuadro delimitador correspondiente contiene un bloque de texto, en lugar de una sola palabra.

Los cuadros delimitadores devueltos por pytesseract.image_to_boxes() encierran letras, así que creo que pytesseract.image_to_data() es lo que está buscando.

Python tesseract puede hacer esto sin escribir en el archivo, usando la función 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) 

Comentaría bajo lennon310 pero no tiene suficiente reputación para comentar …

Para ejecutar su comando de línea de comandos tesseract test.jpg result hocr en un script de python:

 from subprocess import check_call tesseractParams = ['tesseract', 'test.jpg', 'result', 'hocr'] check_call(tesseractParams)