2013-02-10 5 views
0

Я конвертирую свое приложение OCR из C++ в java. Используя Tess4J, я хотел бы получить ограничивающие поля для каждого слова. Однако, по-видимому, TessResultIterator не предоставляет никаких методов. Поэтому я хотел бы, если можно каким-то образом получить эти данные?Tess4J: Как использовать ResultIterator?

Это мой текущий код:

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); 

В C++ я мог бы пойти на такой:

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

ответ

1

Вы можете попробовать следующий фрагмент кода? Я не очень тщательно его тестировал.

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(); 
-1
logger.info("TessBaseAPIGetIterator"); 
    File tiff = new File(testResourcesDataPath, "eurotext.tif"); 
    BufferedImage image = ImageIO.read(new FileInputStream(tiff)); // require jai-imageio lib to read TIFF 
    ByteBuffer buf = ImageIOHelper.convertImageData(image); 
    int bpp = image.getColorModel().getPixelSize(); 
    int bytespp = bpp/8; 
    int bytespl = (int) Math.ceil(image.getWidth() * bpp/8.0); 
    TessAPI1.TessBaseAPIInit3(handle, datapath, language); 
    TessAPI1.TessBaseAPISetPageSegMode(handle, TessPageSegMode.PSM_AUTO); 
    TessAPI1.TessBaseAPISetImage(handle, buf, image.getWidth(), image.getHeight(), bytespp, bytespl); 
    ETEXT_DESC monitor = new ETEXT_DESC(); 
    ITessAPI.TimeVal timeout = new ITessAPI.TimeVal(); 
    timeout.tv_sec = new NativeLong(0L); // time > 0 causes blank ouput 
    monitor.end_time = timeout; 
    ProgressMonitor pmo = new ProgressMonitor(monitor); 
    pmo.start(); 
    TessAPI1.TessBaseAPIRecognize(handle, monitor); 
    logger.info("Message: " + pmo.getMessage()); 
    TessResultIterator ri = TessAPI1.TessBaseAPIGetIterator(handle); 
    TessPageIterator pi = TessAPI1.TessResultIteratorGetPageIterator(ri); 
    TessAPI1.TessPageIteratorBegin(pi); 
    logger.info("Bounding boxes:\nchar(s) left top right bottom confidence font-attributes"); 
    int level = TessPageIteratorLevel.RIL_WORD; 

    // int height = image.getHeight(); 
    do { 
     Pointer ptr = TessAPI1.TessResultIteratorGetUTF8Text(ri, level); 
     String word = ptr.getString(0); 
     TessAPI1.TessDeleteText(ptr); 
     float confidence = TessAPI1.TessResultIteratorConfidence(ri, level); 
     IntBuffer leftB = IntBuffer.allocate(1); 
     IntBuffer topB = IntBuffer.allocate(1); 
     IntBuffer rightB = IntBuffer.allocate(1); 
     IntBuffer bottomB = IntBuffer.allocate(1); 
     TessAPI1.TessPageIteratorBoundingBox(pi, level, leftB, topB, rightB, bottomB); 
     int left = leftB.get(); 
     int top = topB.get(); 
     int right = rightB.get(); 
     int bottom = bottomB.get(); 
     System.out.print(String.format("%s %d %d %d %d %f", word, left, top, right, bottom, confidence)); 
     // logger.info(String.format("%s %d %d %d %d", str, left, height - bottom, right, height - top)); // 
     // training box coordinates 

     IntBuffer boldB = IntBuffer.allocate(1); 
     IntBuffer italicB = IntBuffer.allocate(1); 
     IntBuffer underlinedB = IntBuffer.allocate(1); 
     IntBuffer monospaceB = IntBuffer.allocate(1); 
     IntBuffer serifB = IntBuffer.allocate(1); 
     IntBuffer smallcapsB = IntBuffer.allocate(1); 
     IntBuffer pointSizeB = IntBuffer.allocate(1); 
     IntBuffer fontIdB = IntBuffer.allocate(1); 
     String fontName = TessAPI1.TessResultIteratorWordFontAttributes(ri, boldB, italicB, underlinedB, 
       monospaceB, serifB, smallcapsB, pointSizeB, fontIdB); 
     boolean bold = boldB.get() == TRUE; 
     boolean italic = italicB.get() == TRUE; 
     boolean underlined = underlinedB.get() == TRUE; 
     boolean monospace = monospaceB.get() == TRUE; 
     boolean serif = serifB.get() == TRUE; 
     boolean smallcaps = smallcapsB.get() == TRUE; 
     int pointSize = pointSizeB.get(); 
     int fontId = fontIdB.get(); 
     logger.info(String.format(" font: %s, size: %d, font id: %d, bold: %b," 
       + " italic: %b, underlined: %b, monospace: %b, serif: %b, smallcap: %b", fontName, pointSize, 
       fontId, bold, italic, underlined, monospace, serif, smallcaps)); 
    } while (TessAPI1.TessPageIteratorNext(pi, level) == TRUE); 

    assertTrue(true); 
Смежные вопросы