Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pass OpenCV image to Tesseract in python?

Given Python code invoking Tesseract`s C API and using ctypes library, in the Option #1 image is being loaded by Tesseract and it works fine! The problem is in the Option #2, when I try to pass image loaded by OpenCV the Tesseract returns garbage:

from ctypes import *
import cv2

class API(Structure):
    _fields_ = []

lang = "eng"
ts = cdll.LoadLibrary("c:/Tesseract-OCR/libtesseract302.dll")
ts.TessBaseAPICreate.restype = POINTER(API)
api = ts.TessBaseAPICreate()
rc = ts.TessBaseAPIInit3(api, 'c:/Tesseract-OCR/', lang)

##### Option #1
out = ts.TessBaseAPIProcessPages(api, 'c:/Tesseract-OCR/doc/eurotext.tif', None, 0)
print 'Option #1 => ' + string_at(out)

##### Option #2
#TESS_API void  TESS_CALL TessBaseAPISetImage(TessBaseAPI* handle, const unsigned char* imagedata, int width, int height,
#                                             int bytes_per_pixel, int bytes_per_line);

im = cv2.imread('c:/Temp/Downloads/test-slim/eurotext.jpg', cv2.COLOR_BGR2GRAY)
c_ubyte_p = POINTER(c_ubyte)
##ts.TessBaseAPISetImage.argtypes = [POINTER(API), c_ubyte_p, c_int, c_int, c_int, c_int]
ts.TessBaseAPISetImage(api, im.ctypes.data_as(c_ubyte_p), 800, 1024, 3, 800 * 3)
out = ts.TessBaseAPIGetUTF8Text(api)
print 'Option #2 => ' + string_at(out)

and output is as follows:

Option #1 => The (quick) [brown] {fox} jumps! Over the $43,456.78 #90 dog & duck/goose, as 12.5% of E-mail from [email protected] is spam. Der ,,schnelleâ€� braune Fuchs springt ï¬�ber den faulen Hund. Le renard brun «rapide» saute par-dessus le chien paresseux. La volpe marrone rapida salta sopra il cane pigro. El zorro marrén répido salta sobre el perro perezoso. A raposa marrom rzipida salta sobre o cï¬�o preguicoso.

Option #2 => 7?:5:*:>\—‘- ;2—;i3E:?:;i3".i: ii‘; 3;’ f-ié%:::’::;?:=«’:: =£<:7‘i§5.< :—'\—;:=é:’—..=.:a,';2’:3‘:3_3:l.':—‘:—:£€:-_’:§3;;%§%ai5~«:é::3%ia»€E:

Remarks:

  • I tried python-tesseract and tightocr libraries, which are good
    enough, but lacking documentation
  • here I use opencv.imread in order to have possibility to apply math algorithms on matrix

Any ideas how to pass OpenCV image (which is numpy.ndarray) to Tesseract? Any help would be useful.

like image 418
Agv Avatar asked May 22 '15 19:05

Agv


1 Answers

I use this with python 3: (bw_img is a numpy.ndarray)

import numpy as np
import cv2
from PIL import Image
import pytesseract

...

(thresh, bw_img) = cv2.threshold(bw_img, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
...

img = Image.fromarray(bw_img)
txt = pytesseract.image_to_string(img)
print(txt)
like image 86
Eugenio Respaldiza Avatar answered Sep 29 '22 16:09

Eugenio Respaldiza