How to pass OpenCV image to Tesseract in python?

11,352

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)
Share:
11,352
Admin
Author by

Admin

Updated on June 05, 2022

Comments

  • Admin
    Admin about 2 years

    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.