Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2015, 18:54   #1
Xenon_x
Новичок
Джуниор
 
Регистрация: 25.07.2015
Сообщений: 4
Вопрос Tesseract, изменить путь к tessdata

Здравствуйте. Изучаю библиотеку распознавания изображений Tesseract OCR. Использую компилятор MinGW. Ставил либу по этой инструкции.
В итоге тестовый проект собирается, все работает, но при запуске на другом ПК выдает исключение:
"Error opening data file С:/MinGW/share/testdata/eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory"
.
Судя по найденной информации, нужно чтобы в переменной окружения "TESSDATA_PREFIX" был прописан путь до папки "tessdata" с языковыми файлами.
Если таковой переменной нет, то должен подхватывать из текущей директории программы. Но этого не происходит.
Если переменная окружения не задана, то в ошибке ссылается на путь "С:/MinGW/share/testdata/eng.traineddata".

Установить переменную пытался следующим способом:
Код:
SetEnvironmentVariable("TESSDATA_PREFIX","./")
Проверял через GetEnvironmentVariable, переменная меняется, но не подхватывается в тесеракте.
Если же вручную установить "TESSDATA_PREFIX = ./", то все прекрасно работает.

Буду благодарен совету как можно сделать чтобы testdata цеплялась из директории с программой, либо как из программы эту саму переменную окружения установить(изменить)?
Xenon_x вне форума Ответить с цитированием
Старый 25.07.2015, 22:33   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

./ ето относительный путь.
Попробийте в окружение записать полный путь, типа
TESSDATA_PREFIX=c:/path/to/data

Изменения делаются вызовом SetEnvironmentData (логично ведь) но это надо делать *до * того как запустите tesseract из вашей программы.
waleri вне форума Ответить с цитированием
Старый 25.07.2015, 22:42   #3
Xenon_x
Новичок
Джуниор
 
Регистрация: 25.07.2015
Сообщений: 4
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
./ ето относительный путь.
Попробийте в окружение записать полный путь, типа
TESSDATA_PREFIX=c:/path/to/data

Изменения делаются вызовом SetEnvironmentData (логично ведь) но это надо делать *до * того как запустите tesseract из вашей программы.
Спасибо за ответ. Проблема несколько иная. Если в переменной окружения TESSDATA_PREFIX прописан полный или же относительный путь, то tesseract файлы видит. Но на чистом компьютере этой переменной нету. Т.е. перед запуском приложения если ручками создать переменную в системе, то программа работает. Но как мне создать ее на лету, программно. Желательно без использования дополнительных скриптов, чистым С++.
Xenon_x вне форума Ответить с цитированием
Старый 26.07.2015, 00:09   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

В вашей программе до запуска tesseract вызовите SetEnvironmentData.
Или конфигурируйте программу при установке, через HKEY_CURRENT_USER\Environment
waleri вне форума Ответить с цитированием
Старый 26.07.2015, 00:19   #5
Xenon_x
Новичок
Джуниор
 
Регистрация: 25.07.2015
Сообщений: 4
По умолчанию

Не подскажите в состав какого класса входит функция SetEnvironmentData? Не смог найти ее в доках Microsoft. Сразу вначале программы я меняю переменную через функцию winapi SetEnvironmentVariable. Проверяю что переменная назначена через GetEnvironmentVariable. Далее пробую инициализировать tesseract. В результате при выполнении tesseract все так же не находит папку и ищет он ее по какому то дефолтному пути, в папке компилятора "share".
Собственно вот так:
Код:
int main(int argc, char *argv[])
{
    SetEnvironmentVariable("TESSDATA_PREFIX","./");
    char buffer[1000];
    GetEnvironmentVariable("TESSDATA_PREFIX",(char*)&buffer,sizeof(buffer));
    cout<<buffer<<endl;
        setlocale (LC_NUMERIC, "C");
        tesseract::TessBaseAPI ocr;
        ocr.Init("./", "eng");
    return 0;
}
Xenon_x вне форума Ответить с цитированием
Старый 26.07.2015, 09:39   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ой, я не то написал. Да, речь идет о SetEnvironmentVariable...
Однако, зачем вообще нужна переменная окружения - насколько я вижу, методу Init передается путь к данным, разве нет?

Всегда лучше использовать абсолютный путь.
Ну и не на последнем месте, tesseract вроде open-source - что мешает скачать да посмотреть в исходники?
waleri вне форума Ответить с цитированием
Старый 26.07.2015, 11:41   #7
Xenon_x
Новичок
Джуниор
 
Регистрация: 25.07.2015
Сообщений: 4
По умолчанию

Ради теста прописал полный путь в методе инициализации тессеракта.
Он полностью игнорирует этот параметр, ищет все так же по дефолту в папке компилятора.
Если назначать переменную через SetEnvironmentVariable, то все равно ищет там же, т.е. снова игнор.

Просмотр исходников мне понимания проблемы не принес. Видимо не хватает знаний=\
Xenon_x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распознавание используя tesseract-ocr cardon Win Api 2 05.11.2012 18:38
Изменить путь копирования файлов volchek3 Общие вопросы Delphi 0 08.07.2012 00:24
как изменить путь к подключённой мастером БД Snake22 C# (си шарп) 0 09.06.2012 21:38
Как изменить путь гиперссылки Людмилка Microsoft Office Excel 2 07.12.2011 09:31
Изменить путь к БД Access Andrey85 БД в Delphi 9 14.11.2010 16:23