web-dev-qa-db-fra.com

Obtenir le cadre de sélection des mots reconnus en utilisant python-tesseract

J'utilise python-tesseract pour extraire des mots d'une image. Ceci est un wrapper python pour tesseract qui est un code OCR.

J'utilise le code suivant pour obtenir les mots:

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

Cela ne renvoie que les mots et pas leur emplacement/taille/orientation (ou, en d'autres termes, un cadre de sélection les contenant) dans l'image. Je me demandais s'il y avait un moyen de l'obtenir aussi

12
Abtin Rasoulian

La méthode tesseract.GetBoxText() renvoie la position exacte de chaque caractère dans un tableau.

En outre, il existe une option de ligne de commande tesseract test.jpg result hocr qui générera un fichier result.html avec les coordonnées de chaque mot reconnu. Mais je ne suis pas sûr qu'il puisse être appelé via un script python.

12
lennon310

En utilisant le code ci-dessous, vous pouvez obtenir le cadre de sélection correspondant à chaque caractère.

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)
6
khushhall

Python tesseract peut le faire sans écrire dans un fichier, en utilisant la fonction 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)
5
jtbr

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

Parmi les données renvoyées par pytesseract.image_to_data():

  • left est la distance entre le coin supérieur gauche de la zone de délimitation et le bord gauche de l'image.
  • top est la distance entre le coin supérieur gauche du cadre de sélection, et le bord supérieur de l'image.
  • width et height sont la largeur et la hauteur du cadre de sélection.
  • conf est la confiance du modèle pour la prédiction de Word dans ce cadre de sélection. Si conf est -1, cela signifie que le cadre de sélection correspondant contient un bloc de texte et non un seul mot.

Les boîtes englobantes retournées par pytesseract.image_to_boxes() sont accompagnées de lettres; je crois donc que pytesseract.image_to_data() est ce que vous recherchez.

1
stwykd

Je commenterais sous lennon310 mais je n'ai pas assez de réputation pour commenter ...

Pour exécuter sa commande en ligne de commande tesseract test.jpg result hocr dans un script python:

from subprocess import check_call

tesseractParams = ['tesseract', 'test.jpg', 'result', 'hocr']
check_call(tesseractParams)
0
Endyd