Hi Thanks a lot for the great post. I am trying to use cffi wrapper in my project as the pytesseract was really slow. I use opencv to read my image and I am trying to use your cffi setup and initiate. But I the tesseract is not recognizing any text.
import ctypes import os import cffi import cv2 tessdata = "/home/vagrant/reelz_base/shared/tessdata/" ffi = cffi.FFI() ffi.cdef(""" typedef signed char l_int8; typedef unsigned char l_uint8; typedef short l_int16; typedef unsigned short l_uint16; typedef int l_int32; typedef unsigned int l_uint32; typedef float l_float32; typedef double l_float64; typedef long long l_int64; typedef unsigned long long l_uint64; typedef int l_ok; /*!< return type 0 if OK, 1 on error */ typedef struct TessBaseAPI TessBaseAPI; typedef struct ETEXT_DESC ETEXT_DESC; typedef struct TessPageIterator TessPageIterator; typedef struct TessResultIterator TessResultIterator; typedef int BOOL; typedef enum TessOcrEngineMode { OEM_TESSERACT_ONLY = 0, OEM_LSTM_ONLY = 1, OEM_TESSERACT_LSTM_COMBINED = 2, OEM_DEFAULT = 3} TessOcrEngineMode; typedef enum TessPageSegMode { PSM_OSD_ONLY = 0, PSM_AUTO_OSD = 1, PSM_AUTO_ONLY = 2, PSM_AUTO = 3, PSM_SINGLE_COLUMN = 4, PSM_SINGLE_BLOCK_VERT_TEXT = 5, PSM_SINGLE_BLOCK = 6, PSM_SINGLE_LINE = 7, PSM_SINGLE_WORD = 8, PSM_CIRCLE_WORD = 9, PSM_SINGLE_CHAR = 10, PSM_SPARSE_TEXT = 11, PSM_SPARSE_TEXT_OSD = 12, PSM_COUNT = 13} TessPageSegMode; typedef enum TessPageIteratorLevel { RIL_BLOCK = 0, RIL_PARA = 1, RIL_TEXTLINE = 2, RIL_WORD = 3, RIL_SYMBOL = 4} TessPageIteratorLevel; TessPageIterator* TessBaseAPIAnalyseLayout(TessBaseAPI* handle); TessPageIterator* TessResultIteratorGetPageIterator(TessResultIterator* handle); BOOL TessPageIteratorNext(TessPageIterator* handle, TessPageIteratorLevel level); BOOL TessPageIteratorBoundingBox(const TessPageIterator* handle, TessPageIteratorLevel level, int* left, int* top, int* right, int* bottom); const char* TessVersion(); TessBaseAPI* TessBaseAPICreate(); void TessBaseAPIDelete(TessBaseAPI* handle); size_t TessBaseAPIGetOpenCLDevice(TessBaseAPI* handle, void **device); void TessBaseAPISetInputName( TessBaseAPI* handle, const char* name); const char* TessBaseAPIGetInputName(TessBaseAPI* handle); void TessBaseAPISetInputImage(TessBaseAPI* handle, struct Pix* pix); int TessBaseAPIGetSourceYResolution(TessBaseAPI* handle); BOOL TessBaseAPISetVariable(TessBaseAPI* handle, const char* name, const char* value); BOOL TessBaseAPISetDebugVariable(TessBaseAPI* handle, const char* name, const char* value); void TessBaseAPIPrintVariables( const TessBaseAPI* handle, FILE* fp); BOOL TessBaseAPIPrintVariablesToFile(const TessBaseAPI* handle, const char* filename); int TessBaseAPIInit1(TessBaseAPI* handle, const char* datapath, const char* language, TessOcrEngineMode oem, char** configs, int configs_size); int TessBaseAPIInit2(TessBaseAPI* handle, const char* datapath, const char* language, TessOcrEngineMode oem); int TessBaseAPIInit3(TessBaseAPI* handle, const char* datapath, const char* language); int TessBaseAPIInit4(TessBaseAPI* handle, const char* datapath, const char* language, TessOcrEngineMode mode, char** configs, int configs_size, char** vars_vec, char** vars_values, size_t vars_vec_size, BOOL set_only_non_debug_params); void TessBaseAPISetImage(TessBaseAPI* handle, const unsigned char* imagedata, int width, int height, int bytes_per_pixel, int bytes_per_line); int TessBaseAPIRecognize(TessBaseAPI* handle, ETEXT_DESC* monitor); TessResultIterator* TessBaseAPIGetIterator(TessBaseAPI* handle); BOOL TessResultIteratorNext(TessResultIterator* handle, TessPageIteratorLevel level); char* TessResultIteratorGetUTF8Text(const TessResultIterator* handle, TessPageIteratorLevel level); float TessResultIteratorConfidence(const TessResultIterator* handle, TessPageIteratorLevel level); char* TessBaseAPIGetUTF8Text(TessBaseAPI* handle); const char* TessResultIteratorWordFontAttributes(const TessResultIterator* handle, BOOL* is_bold, BOOL* is_italic, BOOL* is_underlined, BOOL* is_monospace, BOOL* is_serif, BOOL* is_smallcaps, int* pointsize, int* font_id); BOOL TessResultIteratorWordIsFromDictionary(const TessResultIterator* handle); BOOL TessResultIteratorWordIsNumeric(const TessResultIterator* handle); BOOL TessResultIteratorSymbolIsSuperscript(const TessResultIterator* handle); BOOL TessResultIteratorSymbolIsSubscript(const TessResultIterator* handle); BOOL TessResultIteratorSymbolIsDropcap(const TessResultIterator* handle); void TessBaseAPIEnd(TessBaseAPI* handle); """) tess_libname = "/usr/local/lib/libtesseract.so.4" if os.path.exists(tess_libname): tesseract = ffi.dlopen(tess_libname) api = None tesseract_version = ffi.string(tesseract.TessVersion()) print('Tesseract-ocr version', tesseract_version.decode('utf-8')) api = tesseract.TessBaseAPICreate() c_ubyte_p = ctypes.POINTER(ctypes.c_ubyte) lang="eng" oem = tesseract.OEM_DEFAULT tesseract.TessBaseAPIInit3(api, tessdata.encode(), lang.encode()) img = cv2.imread("/data/framecache/testing.jpg") tesseract.TessBaseAPISetDebugVariable(api, "tesseract_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZ") tesseract.TessBaseAPISetDebugVariable(api, "tessedit_pageseg_mode", "8") tesseract.TessBaseAPISetVariable(api, "image_default_resolution", "72") tesseract.TessBaseAPISetImage(api, ffi.cast("unsigned char*", img.ctypes.data), img.shape[0], img.shape[1], 1, img.shape[1]) # tesseract.TessBaseAPIRecognize(api, ffi.NULL) utf8_text = ffi.string(tesseract.TessBaseAPIGetUTF8Text(api)).decode('utf-8') print utf8_text On Sunday, March 24, 2019 at 10:10:36 AM UTC-7, zdenop wrote: > > Hi all, > > I publish my test / example how to use tesseract C-API in python3 via > cffi[1]. > > I am aware of pytesseract module, which seems to be widely used. It is > wrapping tesseract executable, so IMO it could have some limitation e.g. > from point of performance (it using disk operation for input and output). > > It is in form of jupyter notebook[3] (github is able to show it, but not > run ;-)) so you can interactively view what is happening. > > My aim is not to create new tesseract python wrapper (I do not have a time > for it, and I am not able to create nice python code as pytesseract has > :-) ) so it is not robust: I just did it on windows 64 bit, but IMO is > should be possible with small modification to use in Linux and Mac. If > needed I can add 32bit windows libs... > > Personally I would like have python tesseract and leptonica module using > directly its API... I know that James Barlow already started to wrapping > leptonica, but it is (not yet?) available as independent module (it is part > of OCRmyPDF). > > Anyway I hope this will help somebody. > > [1] https://github.com/zdenop/SimpleTesseractPythonWrapper > [2] https://pypi.org/project/pytesseract/ > [3] > https://github.com/zdenop/SimpleTesseractPythonWrapper/blob/master/SimpleTesseractPythonWrapper.ipynb > > [4] https://github.com/jbarlow83/OCRmyPDF/tree/master/src/ocrmypdf/lib > > Zdenko > -- You received this message because you are subscribed to the Google Groups "tesseract-ocr" group. To unsubscribe from this group and stop receiving emails from it, send an email to tesseract-ocr+unsubscr...@googlegroups.com. To post to this group, send email to tesseract-ocr@googlegroups.com. Visit this group at https://groups.google.com/group/tesseract-ocr. To view this discussion on the web visit https://groups.google.com/d/msgid/tesseract-ocr/d6253a61-d796-4cce-8412-f2cc61e83000%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.