Не могу использовать ChoiceIterator в тессеракте - PullRequest
2 голосов
/ 28 октября 2011

Прежде всего, я хочу подтвердить, что я правильно понимаю итератор выбора.

Например, если у меня есть слово на изображении "область действия",

Итератор выбора должен дать мне что-то вроде "s" и, возможно, после Next (), "5".

для 3. буквы «o», возможно, она дает мне «0», после Next () «O» и после Next () «o».

Я правильно понимаю?

Вот весь мой связанный код,

api.SetImage((uchar*)img->imageData,img->width,img->height,img->depth/8,img->widthStep);

api.SetRectangle(0,0,img->width, img->height);
int left,top,right,bottom;
left=0;top=0;right=0;bottom=0;
api.Recognize(NULL);
tesseract::ResultIterator *ri=api.GetIterator();
tesseract::ChoiceIterator *choiceItr;
const tesseract::ResultIterator itr = *ri;
choiceItr = new tesseract::ChoiceIterator(itr);
const char * out=choiceItr->GetUTF8Text();
char * out2=(*ri).GetUTF8Text(tesseract::RIL_SYMBOL);
printf("out:%s,out2:%s",out,out2);

вывод на консоль:

из (нуль), out2: P

p - ожидаемый результат итератора результата, но вывод итератора выбора равен нулю.

спасибо за идеи.

приблизительно решено:

// This ensures Tesseract's "blob_choices" structures are filled
    SetVariable("save_best_choices", "T");

http://code.google.com/p/tesseract-ocr/issues/detail?id=555

1 Ответ

5 голосов
/ 24 января 2012

Если вы еще не нашли решение, следующий код показывает, как выполнить итерацию по всем символам (используя ResultIterator) и его лучшие альтернативы (используя ChoiceIterator).

tess.SetVariable("save_best_choices", "T"); 
tess.SetImage(...); 
tess.Recognize(0); 

tesseract::ResultIterator* ri = tess.GetIterator();
tesseract::ChoiceIterator* ci; 

if(ri != 0)
{
    do
    {
        const char* symbol = ri->GetUTF8Text(tesseract::RIL_SYMBOL);

        if(symbol != 0)
        {
            float conf = ri->Confidence(tesseract::RIL_SYMBOL); 
            std::cout << "\tnext symbol: " << symbol << "\tconf: " << conf << "\n"; 

            const tesseract::ResultIterator itr = *ri; 
            ci = new tesseract::ChoiceIterator(itr);

            do
            {
                const char* choice = ci->GetUTF8Text(); 
                std::cout << "\t\t" << choice << " conf: " << ci->Confidence() << "\n"; 
            }
            while(ci->Next()); 

            delete ci; 
        }

        delete[] symbol;
    }
    while((ri->Next(tesseract::RIL_SYMBOL)));
}
...