tesseract を使用して数字を認識しようとしています。それはかなりうまく機能しますが、時々間違った結果が得られます (9 ではなく 8 など)。いくつかの非 ocr メソッドで精度を向上させる方法は知っていますが、信頼レベルのある他の結果が必要です。各 ResultIterator に対して ChoiceIterator を使用して、最良の選択肢を得ることがわかりました。
tesseract::TessBaseAPI tess;
tess.SetPageSegMode(tesseract::PSM_SINGLE_CHAR);
tess.SetVariable("save_best_choices", "T");
[setting input image here]
tess.Recognize(NULL);
tesseract::ResultIterator* ri = tess.GetIterator();
tesseract::ChoiceIterator* ci;
if(ri != 0)
{
char* symbol = ri->GetUTF8Text(tesseract::RIL_SYMBOL);
if(symbol != 0)
{
float conf = ri->Confidence(tesseract::RIL_SYMBOL);
cout << symbol << "\tconf: " << conf << "\n";
const tesseract::ResultIterator itr = *ri;
ci = new tesseract::ChoiceIterator(itr);
do {
const char* choice = ci->GetUTF8Text();
if (choice) {
std::cout << "\t" << choice << " conf: " << ci->Confidence() << "\n";
}
} while(ci->Next());
// delete[] symbol;
}
}
しかし問題は、ci->GetUTF8Text() が常に null ポインターを返すことです。
MSVC2010 Expressでコンパイルされたtesseract 3.02をDLLとして使用しています。