Инициализация Tesseract до или после namedWindow из OpenCV - PullRequest
0 голосов
/ 06 октября 2018

Интересно, это баг или я чего-то не понимаю.
Образец 1:

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

Результат:

Works fine.


Образец 2:

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

Результат:

!strcmp(locale, "C"):Error:Assert failed:in file baseapi.cpp, line 192
Segmentation fault (core dumped)

Разница:
Порядок создания окна и инициализации tesseract.
Редактировать:

locale = std::setlocale(LC_CTYPE, nullptr);
ASSERT_HOST(!strcmp(locale, "C"));

Это утверждение не выполняется.Означает ли это, что opencv устанавливает локаль, а tesseract не может ее изменить?

1 Ответ

0 голосов
/ 06 октября 2018

Это известная проблема тессеракта.Рассматривая проблему github Команда Tesseract в настоящее время работает над ее решением.В качестве временного решения вы можете обернуть все вызовы tesseract следующим кодом

// set locale to "C" for tesseract
char *old_ctype = strdup(setlocale(LC_ALL, NULL));
setlocale(LC_ALL, "C");
// some tesseract function, this is just an example.
tesseract::TessBaseAPI api;
api.InitForAnalysePage();

// restore your previous locale
setlocale(LC_ALL, old_ctype);
free(old_ctype);
...