Skip to content

Commit 60d1b18

Browse files
committed
Wrap TessBaseAPIRecognize() and some ResultIterator functions
Wrapped enums: TessPageIteratorLevel Wrapped functions: TessBaseAPIRecognize() TessBaseAPIGetIterator() TessResultIteratorDelete() TessResultIteratorNext() TessResultIteratorGetUTF8Text() Wrapped structs: TessResultIterator
1 parent 3ac6d0f commit 60d1b18

File tree

2 files changed

+72
-4
lines changed

2 files changed

+72
-4
lines changed

helpers.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ import (
77
"unsafe"
88
)
99

10+
func gobool(b C.int) bool {
11+
if b != 0 {
12+
return true
13+
}
14+
15+
return false
16+
}
17+
1018
func cStringVectorToStringslice(cStringVector **C.char) []string {
1119
// get pointer size to do iteration
1220
cPtrSize := unsafe.Sizeof(cStringVector)

tesseract.go

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -358,8 +358,71 @@ func (t *Tess) SetRectangle(left, top, width, height int) {
358358
C.TessBaseAPISetRectangle(t.tba, C.int(left), C.int(top), C.int(width), C.int(height))
359359
}
360360

361-
// typedef struct TessPageIterator TessPageIterator;
361+
// int TessBaseAPIRecognize(TessBaseAPI* handle, ETEXT_DESC* monitor);
362+
func (t *Tess) Recognize() error {
363+
ret := C.TessBaseAPIRecognize(t.tba, nil)
364+
if ret != 0 {
365+
return errors.New("recognition failed")
366+
}
367+
return nil
368+
}
369+
370+
// typedef enum TessPageIteratorLevel { RIL_BLOCK, RIL_PARA, RIL_TEXTLINE, RIL_WORD, RIL_SYMBOL} TessPageIteratorLevel;
371+
type PageIteratorLevel int
372+
373+
const (
374+
RIL_BLOCK PageIteratorLevel = iota
375+
RIL_PARA
376+
RIL_TEXTLINE
377+
RIL_WORD
378+
RIL_SYMBOL
379+
)
380+
381+
// TessResultIterator* TessBaseAPIGetIterator(TessBaseAPI* handle);
382+
func (t *Tess) Iterator() (*ResultIterator, error) {
383+
ri := C.TessBaseAPIGetIterator(t.tba)
384+
385+
if ri == nil {
386+
return nil, errors.New("no results")
387+
}
388+
389+
resultIterator := &ResultIterator{
390+
ri: ri,
391+
}
392+
393+
runtime.SetFinalizer(resultIterator, (*ResultIterator).delete)
394+
return resultIterator, nil
395+
}
396+
362397
// typedef struct TessResultIterator TessResultIterator;
398+
type ResultIterator struct {
399+
ri *C.TessResultIterator
400+
}
401+
402+
// void TessResultIteratorDelete(TessResultIterator* handle);
403+
func (r *ResultIterator) delete() {
404+
if r.ri != nil {
405+
C.TessResultIteratorDelete(r.ri)
406+
}
407+
}
408+
409+
// TESS_API BOOL TESS_CALL TessResultIteratorNext(TessResultIterator* handle, TessPageIteratorLevel level);
410+
func (r *ResultIterator) Next(level PageIteratorLevel) bool {
411+
return gobool(C.TessResultIteratorNext(r.ri, C.TessPageIteratorLevel(level)))
412+
}
413+
414+
// char* TessResultIteratorGetUTF8Text(const TessResultIterator* handle, TessPageIteratorLevel level);
415+
func (r *ResultIterator) Text(level PageIteratorLevel) (string, error) {
416+
cText := C.TessResultIteratorGetUTF8Text(r.ri, C.TessPageIteratorLevel(level))
417+
if cText == nil {
418+
return "", errors.New("already at the end")
419+
}
420+
defer C.free(unsafe.Pointer(cText))
421+
text := C.GoString(cText)
422+
return text, nil
423+
}
424+
425+
// typedef struct TessPageIterator TessPageIterator;
363426
// typedef struct TessMutableIterator TessMutableIterator;
364427
// typedef enum TessOcrEngineMode { OEM_TESSERACT_ONLY, OEM_CUBE_ONLY, OEM_TESSERACT_CUBE_COMBINED, OEM_DEFAULT } TessOcrEngineMode;
365428
// typedef enum TessPageSegMode { PSM_OSD_ONLY, PSM_AUTO_OSD, PSM_AUTO_ONLY, PSM_AUTO, PSM_SINGLE_COLUMN, PSM_SINGLE_BLOCK_VERT_TEXT, PSM_SINGLE_BLOCK, PSM_SINGLE_LINE, PSM_SINGLE_WORD, PSM_CIRCLE_WORD, PSM_SINGLE_CHAR, PSM_COUNT } TessPageSegMode;
@@ -425,12 +488,10 @@ func (t *Tess) SetRectangle(left, top, width, height int) {
425488

426489
// TessPageIterator* TessBaseAPIAnalyseLayout(TessBaseAPI* handle);
427490

428-
// int TessBaseAPIRecognize(TessBaseAPI* handle, ETEXT_DESC* monitor);
429491
// int TessBaseAPIRecognizeForChopTest(TessBaseAPI* handle, ETEXT_DESC* monitor);
430492
// char* TessBaseAPIProcessPages(TessBaseAPI* handle, const char* filename, const char* retry_config, int timeout_millisec);
431493
// char* TessBaseAPIProcessPage(TessBaseAPI* handle, PIX* pix, int page_index, const char* filename, const char* retry_config, int timeout_millisec);
432494

433-
// TessResultIterator* TessBaseAPIGetIterator(TessBaseAPI* handle);
434495
// TessMutableIterator* TessBaseAPIGetMutableIterator(TessBaseAPI* handle);
435496

436497
// int TessBaseAPIMeanTextConf(TessBaseAPI* handle);
@@ -460,7 +521,6 @@ func (t *Tess) SetRectangle(left, top, width, height int) {
460521
// void TessPageIteratorOrientation(TessPageIterator* handle, TessOrientation *orientation, TessWritingDirection *writing_direction, TessTextlineOrder *textline_order, float *deskew_angle);
461522

462523
// /* Result iterator */
463-
// void TessResultIteratorDelete(TessResultIterator* handle);
464524
// TessResultIterator* TessResultIteratorCopy(const TessResultIterator* handle);
465525
// TessPageIterator* TessResultIteratorGetPageIterator(TessResultIterator* handle);
466526
// const TessPageIterator* TessResultIteratorGetPageIteratorConst(const TessResultIterator* handle);

0 commit comments

Comments
 (0)