My code use PIL to open image files. You need to convert cv image structure to pix or send the data to tesseract[1] with void SetImage(const unsigned char* imagedata, int width, int height, int bytes_per_pixel, int bytes_per_line)[2]
[1] https://stackoverflow.com/questions/8115368/converting-cvmat-for-tesseract [2] https://github.com/tesseract- ocr/tesseract/blob/3e7144e79654d9da7a180a3c51e843afb4a77491/src/api/baseapi.h#L333 If you have problem, post your code and image. Zdenko ut 2. 4. 2019 o 8:46 Guru Govindan <gurunathan.govin...@gmail.com> napĂsal(a): > 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 > <https://groups.google.com/d/msgid/tesseract-ocr/d6253a61-d796-4cce-8412-f2cc61e83000%40googlegroups.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- 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/CAJbzG8zXY4AJF5%2BoHnY7DEb4XF0%2Bsb-L1%2B6Jiwd6SaZTrKnmxg%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.