Search code examples
javaocrtesseract

Tess4J: How to use ResultIterator?


I'm converting my OCR application from c++ to java. Using Tess4J I'd like to get the bounding boxes for every word. However, apparently TessResultIterator doesn't provide any methods. So I'd like to if it's possible to somehow get this data?

This is my current code:

TessBaseAPI api = TessAPI1.TessBaseAPICreate();
TessAPI1.TessBaseAPIInit3(api, path, lang);
TessAPI1.TessBaseAPISetPageSegMode(api, TessAPI1.TessPageSegMode.PSM_AUTO);
TessAPI1.TessBaseAPISetImage(api, img, w, h, bpp, bpp*w);
TessAPI1.TessBaseAPIGetUTF8Text(api);
TessResultIterator it = TessAPI1.TessBaseAPIGetIterator(api); 

In c++ I could then go on like this:

char* text = it->GetUTF8Text(tesseract::RIL_WORD); 
int left, top, right, bttm;
it->BoundingBox(tesseract::RIL_WORD, &left, &top, &right, &bttm); 

Solution

  • Can you try the following code snippet? I did not really test it thoroughly.

    TessResultIterator ri = TessAPI1.TessBaseAPIGetIterator(api);
    TessPageIterator pi = TessAPI1.TessResultIteratorGetPageIterator(ri);
    String str = TessAPI1.TessResultIteratorGetUTF8Text(ri, TessPageIteratorLevel.RIL_WORD);
    IntBuffer leftB = IntBuffer.allocate(1);
    IntBuffer topB = IntBuffer.allocate(1);
    IntBuffer rightB = IntBuffer.allocate(1);
    IntBuffer bottomB = IntBuffer.allocate(1);
    TessAPI1.TessPageIteratorBoundingBox(pi, TessPageIteratorLevel.RIL_WORD, leftB, topB, rightB, bottomB);
    int left = leftB.get();
    int top = topB.get();
    int right = rightB.get();
    int bottom = bottomB.get();