Отключить OCR с помощью словаря в tesseract C++ API

У меня есть приложение, в котором технические спецификации распознаются с помощью API tesseract. Я инициализирую это так:

tesseract::TessBaseAPI tess;
tess.Init(NULL, "eng", tesseract::OEM_TESSERACT_ONLY);

Однако даже после использования настраиваемых белых списков, подобных этому

tess.SetVariable("tessedit_char_blacklist", "");
tess.SetVariable("tessedit_char_whitelist", myWhitelist);

некоторые записи таблицы распознаются неправильно, например PA3 распознается как FAB.

Как я могу отключить распознавание текста с помощью словаря, т.е. Чтобы не влиять на другие инструменты, я не хочу изменять глобальные файлы конфигурации, если это возможно.

Примечание. Это не дубликат этого предыдущего вопрос, потому что указанный вопрос явно запрашивает инструмент командной строки, а я явно запрашиваю API tesseract.


person Uli Köhler    schedule 08.10.2015    source источник


Ответы (3)


Вы можете сделать это следующим образом

tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
if (api->Init(NULL, "eng"))
{
    fprintf(stderr, "Could not initialize tesseract.\n");
    exit(1);
}

if(!api->SetVariable("tessedit_enable_doc_dict", "0"))
{
    cout << "Unable to enable dictionary" << endl;
}

Просто передайте "tessedit_enable_doc_dict" в качестве параметра функции SetVariable и соответствующее логическое значение.

Я нашел его в tesseractclass.h https://tesseract-ocr.github.io/a00736_source.html заголовочный файл (строка 839), и я думаю, что лучший способ найти правильные параметры - это просмотреть значения, определенные в нем (заголовочный файл, соответствующий вашей версии. У меня 3.04). Я попробовал несколько, которые я нашел в Интернете раньше, но не работал. Это была рабочая конфигурация для меня.

person HarshaXsoad    schedule 14.12.2015
comment
Извините за долгую задержку. Поскольку я на самом деле не продолжил свою проблему с Тессерактом, я действительно не исследовал, является ли мой ответ нашим вашим ответом лучшим способом решения проблемы. Однако, оглядываясь назад, я думаю, что ясно, что tessedit_enable_doc_dict - это путь, поэтому я, наконец, приму ваш ответ :-) - person Uli Köhler; 15.06.2017

Вы можете просто установить штрафы равными нулю:

tess.SetVariable("segment_penalty_garbage", "0");
tess.SetVariable("segment_penalty_dict_nonword", "0");
tess.SetVariable("segment_penalty_dict_frequent_word", "0");
tess.SetVariable("segment_penalty_dict_case_ok", "0");
tess.SetVariable("segment_penalty_dict_case_bad", "0");

Хотя словарь все еще остается активным, этот подход в основном сообщает алгоритму, что попадание по словарю (включая неправильную пунктуацию и т. д.) не лучше, чем попадание без словаря.

Для справки см. dict.cpp исходный код.

person Uli Köhler    schedule 08.10.2015

Вы можете отключить словари только во время инициализации API. См. пример API tesseract-ocr на C++ по изменению параметров инициализации. тессеракт 3.02.

person user898678    schedule 08.10.2015
comment
Так ты имеешь в виду, если я установлю load_system_dawg = 0, словарь не будет применяться? - person Uli Köhler; 09.10.2015
comment
Нет точно. Если вы используете во время инициализации tesseract load_system_dawg = 0 системный словарь не будет загружен. Если вы хотите использовать его позже, вам нужно будет снова инициализировать tesseract. - person user898678; 10.10.2015