How does the Tesseract variable "save_blob_choices" works?

Viewed 1115

So I've been trying to use tesseract ocr, (specifically tess-two) for an android project to scan some symbols.

Everything works fine but sometimes the recognized String is returned as null. One of the solutions I found was to set the variable save_blob_choices to true in order to have tesseract save alternatives for recognition.

But I don't know if it indeed is supposed to do that. Where does it save the alternatives? How do I access them?

Of course if you have any other solution apart from using this variable, please tell me.

Here is my code:

TessBaseAPI baseApi = new TessBaseAPI();
baseApi.setDebug(true);
baseApi.init(MainActivity.DATA_PATH, MainActivity.lang);
baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_CHAR);


baseApi.setVariable("tessedit_char_whitelist","abcdefghijklmnopqrst");
baseApi.setVariable("save_blob_choices", "T");

baseApi.setImage(mainBitmap);

publishProgress(80);


mainBitmap.recycle();
mainBitmap = null;

// Iterate through the results.
ResultIterator iterator = baseApi.getResultIterator();
String lastUTF8Text;
float lastConfidence;


iterator.begin();
do {
    lastUTF8Text = iterator.getUTF8Text(TessBaseAPI.PageIteratorLevel.RIL_SYMBOL);
    lastConfidence = iterator.confidence(TessBaseAPI.PageIteratorLevel.RIL_SYMBOL);

    Log.i("string, intConfidence",lastUTF8Text+", "+lastConfidence);
} while (iterator.next(TessBaseAPI.PageIteratorLevel.RIL_SYMBOL));


baseApi.end();

Also as an extra question, is base.setDebug(true) supposed to work? Because it doesn't seem to do anything.

1 Answers

pls check the following examples. https://github.com/tesseract-ocr/tesseract/wiki/APIExample

Example of iterator over the classifier choices for a single symbol

Pix *image = pixRead("/usr/src/tesseract/testing/phototest.tif");
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
api->Init(NULL, "eng");
api->SetImage(image);
api->SetVariable("save_blob_choices", "T");
api->SetRectangle(37, 228, 548, 31);
api->Recognize(NULL);

tesseract::ResultIterator* ri = api->GetIterator();
tesseract::PageIteratorLevel level = tesseract::RIL_SYMBOL;
if(ri != 0) {
    do {
        const char* symbol = ri->GetUTF8Text(level);
        float conf = ri->Confidence(level);
        if(symbol != 0) {
            printf("symbol %s, conf: %f", symbol, conf);
            bool indent = false;
            tesseract::ChoiceIterator ci(*ri);
            do {
                if (indent) printf("\t\t ");
                printf("\t- ");
                const char* choice = ci.GetUTF8Text();
                printf("%s conf: %f\n", choice, ci.Confidence());
                indent = true;
            } while(ci.Next());
        }
        printf("---------------------------------------------\n");
        delete[] symbol;
    } while((ri->Next(level)));
}
Related