I'm a newbie in OCR and I'm trying to use java to detect tables in images (my job requires java as a development language). I used less4j and I managed to display in the console "Table found" less4j debugging message but I need to put this detection in a variable (i.e. I need a variable that tells me if there is a table in the image or not, not a debugging message).
Here is my piece of code:
import static net.sourceforge.lept4j.ILeptonica.L_CLONE;
import java.io.File;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.PointerByReference;
import net.sourceforge.lept4j.Box;
import net.sourceforge.lept4j.Boxa;
import net.sourceforge.lept4j.Leptonica;
import net.sourceforge.lept4j.Leptonica1;
import net.sourceforge.lept4j.Pix;
import net.sourceforge.lept4j.util.LeptUtils;
import net.sourceforge.tess4j.ITessAPI;
import net.sourceforge.tess4j.ITessAPI.TessBaseAPI;
import net.sourceforge.tess4j.ITessAPI.TessPageIteratorLevel;
import net.sourceforge.tess4j.ITessAPI.TessPageSegMode;
import net.sourceforge.tess4j.TessAPI;
import net.sourceforge.tess4j.TessAPI1;
import net.sourceforge.tess4j.TesseractException;
public class Scritte {
static TessAPI api = new TessAPIImpl().getInstance();
static TessBaseAPI handle = TessAPI1.TessBaseAPICreate();
private final static String datapath = "./tessdata";
static String language = "eng+fra";
public static void main(String[] args) throws TesseractException {
File image = new File("./images/facture.jpg");
Leptonica leptInstance = Leptonica.INSTANCE;
Pix pix = leptInstance.pixRead(image.getPath());
api.TessBaseAPIInit3(handle, datapath, language);
api.TessBaseAPISetImage2(handle, pix);
api.TessBaseAPISetVariable(handle,"textord_tabfind_find_tables", "1");
api.TessBaseAPISetVariable(handle,"textord_tablefind_recognize_tables", "1");
api.TessBaseAPISetVariable(handle,"enable_new_segsearch", "1");
api.TessBaseAPISetVariable(handle,"textord_dump_table_images", "1");
api.TessBaseAPISetVariable(handle,"gapmap_debug", "1");
api.TessBaseAPISetPageSegMode(handle, TessPageSegMode.PSM_AUTO);
PointerByReference pixa = new PointerByReference();
PointerByReference blockids = new PointerByReference();
Boxa boxes = api.TessBaseAPIGetComponentImages(handle, TessPageIteratorLevel.RIL_BLOCK, ITessAPI.TRUE, pixa, blockids);
int boxCount = leptInstance.boxaGetCount(boxes);
for (int i = 0; i < boxCount; i++) {
Box box = Leptonica1.boxaGetBox(boxes, i, L_CLONE);
if (box == null) {
continue;
}
TessAPI1.TessBaseAPISetRectangle(handle, box.x, box.y, box.w, box.h);
Pointer utf8Text = TessAPI1.TessBaseAPIGetUTF8Text(handle);
TessAPI1.TessDeleteText(utf8Text);
LeptUtils.dispose(box);
}
// release Pix and Boxa resources
LeptUtils.dispose(pix);
LeptUtils.dispose(boxes);
}
}
is there is any solution?
PS: Itried to use "TessAPI1.TessPageIteratorBlockType" but it does not work correctly and here is my piece of code:
TessResultIterator ri = TessAPI1.TessBaseAPIGetIterator(api);
TessPageIterator pi = TessAPI1.TessResultIteratorGetPageIterator(ri);
int indicator = TessAPI1.TessPageIteratorBlockType(pi);
System.out.println(indicator);