tesseract-ocr как включить baseapi.h - PullRequest
4 голосов
/ 16 ноября 2011

Я следовал инструкциям, которые нашел в форме tessesract, о том, как включить baseapi.h.

я использую:

VS2010
Версия тессеракт 3.01

Я пытаюсь понять, как использовать baseapi.h.

программа испытаний:

#define __MSW32__

 #include "baseapi.h"

using namespace  tesseract;

int _tmain(int argc, _TCHAR* argv[])

{

   TessBaseAPI *myTestApi;

   myTestApi=new TessBaseAPI();

   //myTestApi->Init("d:/temp.jpg","eng");

   return 0;

}

Форма обучения:

добавить следующие папки в «Дополнительные каталоги включения» (свойства) - чтобы разрешить проблемы с не найденными файлами после включения «baseapi.h»

тессеракт-3,01 / апи

тессеракт-3,01 / ccmain

тессеракт-3,01 / ccutil

тессеракт-3,01 / ccstruct enter image description here

добавил следующие библиотеки в «Свойства / Компоновщик / Ввод / Дополнительные зависимости» для использования библиотек Tesseract и Leptonica libtesseract.lib; liblept.lib

enter image description here // добавлены следующие пути к «Свойствам / Linker / General / Дополнительные каталоги библиотек», чтобы найти библиотеки Tesseract и Leptonica тессеракт-3,01 / VS2010 / Release тессеракт-3,01 / VS2008 / Библиотека

enter image description here

И я пытаюсь запустить сейчас

enter image description here

Поэтому я пытаюсь найти libs libtesseract.lib и заменить на libtesseract_tessopt.lib, а затем запустить enter image description here

1>------ Build started: Project: test4, Configuration: Debug Win32 ------
1>  test4.cpp
1>test4.obj : error LNK2019: unresolved external symbol "public: __thiscall tesseract::TessBaseAPI::TessBaseAPI(void)" (??0TessBaseAPI@tesseract@@QAE@XZ) referenced in function _wmain
1>c:\users\eran0708\documents\visual studio 2010\Projects\test4\Debug\test4.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Есть ли что-нибудь известное решение проблемы?

спасибо,

Eran

! [Введите описание изображения здесь] [6]

! [Введите описание изображения здесь] [7]

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

Это то, что я сделал для его компиляции:

1.) Скопируйте все заголовочные файлы в один каталог include, поэтому позже в каталоги включения необходимо добавить только §(TESS_DIR)\include.

скопировать заголовки лептоники в $(TESS_DIR)\include\leptonica.

2.) Откройте vs2010\tesseract.sln и скомпилируйте все конфигурации.Затем скопируйте все файлы lib в $(TESS_DIR)\lib\debug и $(TESS_DIR)\lib\release.Затем добавьте эти каталоги в настройки сборки.

3.) Скопируйте скомпилированные libtesseract.dll и liblept168.dll, а также папку tessdata, связывающуюся с eng.traineddata, в папку Release вашего проекта.

4.) Добавьте эти библиотеки в качестве дополнительных зависимостей:

libtesseract.lib
liblept168.lib

5.) #include <baseapi.h>

0 голосов
/ 18 сентября 2012

Я понял, что если вы используете Visual Studio 2010 и используете Windows Form / Designer, вы можете легко добавить этот способ без проблем

1) добавьте следующие проекты в свой проект (я вас предупреждаю, не добавляйте решение tesseract или меняйте настройки в добавляемых вами проектах, если только вы не любите ненавидеть себя) ccmain ccstruct ccutil классифицировать куб cutil ДИКТ образ libtesseract nutral_networks textord зритель wordrec

Вы можете добавить другие, но вы действительно не хотите, чтобы все, что встроено в ваш проект, не так ли? нааа, построй те отдельно

2) перейдите к свойствам вашего проекта и добавьте libtesseract в качестве ссылки, теперь вы можете видеть его как проект, это сделает его так, что ваш проект будет построен быстро, без проверки миллионов предупреждений в пределах tesseract. [общие свойства] -> [добавить ссылку]

3) щелкните правой кнопкой мыши свой проект в обозревателе решений и выберите зависимости проекта, убедитесь, что он зависит от libtesseract или даже от всех них, это просто означает, что они создаются перед вашим проектом.

4) проекты tesseract 2010 visual studio содержат ряд параметров конфигурации, таких как release, release.dll, debug, debug.dll, похоже, что настройки release.dll создают правильные файлы. Сначала установите выход решения для release.dll. Нажмите на свойства вашего проекта. Затем нажмите менеджер конфигурации. Если это недоступно, сделайте это, щелкните свойства РЕШЕНИЯ в дереве решения и перейдите на вкладку конфигурации, вы увидите список проектов и соответствующие параметры конфигурации. Вы заметите, что ваш проект не установлен на release.dll, даже если вывод. Если вы выбрали второй маршрут, вам все равно нужно щелкнуть диспетчер конфигурации. Затем вы можете отредактировать настройки, щелкнуть новые в настройках ваших проектов и назвать их release.dll ... точно так же, как и все остальные, и скопировать настройки из выпуска. Сделайте то же самое для Debug, чтобы у вас было имя debug.dll, скопированное из настроек отладки. где ... почти готово

5) Не пытайтесь изменить настройки tesseracts, чтобы они соответствовали вашим ... это не сработает .... и когда выйдет новый выпуск, вы не сможете просто "добавить его" и уйти. Примите тот факт, что в этом состоянии ваши новые режимы - Release.dll и Debug.dll. не переживайте ... вы можете вернуться, когда все будет готово, и удалить проекты из своего решения.

6) Угадай, откуда появятся библиотеки и библиотеки? в вашем проекте вам может понадобиться, а может и не понадобиться добавлять каталоги библиотеки. Некоторые говорят, что нужно свалить все заголовки в одну папку, поэтому им нужно добавить только одну папку для включений, но не меня. Я хочу иметь возможность удалить папку tesseract и перезагрузить ее из zips без лишней работы .... и быть полностью готовым к обновлению одним движением или восстановлению, если я напутал код. Это немного работы, и вы можете использовать код вместо настроек, как я это делаю, но вы должны включить все папки, содержащие заголовочные файлы, в папку проекта tesseract 2010 и оставить их в покое.

7) нет необходимости добавлять файлы в ваш проект. только эти строки кода ..... Я включил некоторый дополнительный код, который преобразует из одного набора внешних данных в версию TIFF без необходимости сохранять / загружать файл. разве я не мила?

8) теперь вы можете полностью отлаживать в debug.dll и release.dll, как только вы успешно встроили его в свой проект, даже если вы можете удалить все добавленные проекты, и он будет исправлен. Никаких лишних компиляций или ошибок. полностью исправимо, все естественно.

9) Если я правильно помню, я не мог обойти тот факт, что мне пришлось скопировать файлы в 2008 / lib / в папку с выпуском моих проектов… .darn it.

In my projects “functions.h” I put
#pragma comment (lib, "liblept.lib" ) 
#define _USE_TESSERACT_ 
#ifdef _USE_TESSERACT_ 
#pragma comment (lib, "libtesseract.lib" ) 
#include <baseapi.h> 
#endif 
#include <allheaders.h> 

в моем основном проекте я поместил это в класс в качестве участника: tesseract :: TessBaseAPI * readSomeNombers;

и, конечно, я где-то включил "functions.h"

затем я помещаю это в конструктор классов:

readSomeNombers = new tesseract::TessBaseAPI(); 
readSomeNombers ->Init(NULL, "eng" ); 
readSomeNombers ->SetVariable( "tessedit_char_whitelist", "0123456789,." ); 

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

void Gaara::scanTheSpot() 
{ 
    Pix *someNewPix; 
    char* outText; 
    ostringstream tempStream; 
    RECT tempRect; 
    someNewPix = pixCreate( 200 , 40 , 32 ); 
    convertEasyBmpToPix( &scanImage, someNewPix, 87, 42 ); 

    readSomeNombers ->SetImage(someNewPix); 
    outText = readSomeNombers ->GetUTF8Text(); 
    tempStream.str(""); 
    tempStream << outText; 
    classMemeberVariable = tempStream.str(); 
//pixWrite( "test.bmp", someNewPix, IFF_BMP ); 
} 

Объект, содержащий информацию, которую я хочу сканировать, находится в памяти и на него указывает & scanImage. Это из библиотеки «EasyBMP», но это не важно.

Кстати, с которой я имею дело в функции в «functions.h» / «functions.cpp», я делаю здесь небольшую дополнительную обработку, пока я нахожусь в цикле, а именно прореживаю символы и делаю их черными и белый и чередующийся черный и белый, что непривычно. На этом этапе моего развития я все еще ищу способы улучшить признание. Хотя по моим предположениям это еще не дало плохих данных. На мой взгляд, для простоты использовать данные Tess по умолчанию. Я действую эвристически, чтобы решить очень сложную проблему.

void convertEasyBmpToPix( BMP *sourceImage, PIX *outputImage, unsigned startX, unsigned startY ) 
{ 
    int endX = startX + ( pixGetWidth( outputImage ) ); 
    int endY = startY + ( pixGetHeight( outputImage ) ); 
    unsigned destinationX; 
    unsigned destinationY = 0; 
    for( int yLoop = startY; yLoop < endY; yLoop++ ) 
    { 
        destinationX = 0; 
        for( int xLoop = startX; xLoop < endX; xLoop++ ) 
        { 
            if( isWhite( &( sourceImage->GetPixel( xLoop, yLoop ) ) ) ) 
            { 
                pixSetRGBPixel( outputImage, destinationX, destinationY, 0,0,0 ); 
            } 
            else 
            { 
                pixSetRGBPixel( outputImage, destinationX, destinationY, 255,255,255 ); 
            } 
            destinationX++; 
        } 
        destinationY++; 
    } 
} 
bool isWhite( RGBApixel *image ) 
{ 
    if( 
        //destination->SetPixel( x, y, source->GetPixel( xLoop, yLoop ) ); 
        ( image->Red   < 50 ) || 
        ( image->Blue  < 50 ) || 
        ( image->Green < 50 ) 
        ) 
    { 
        return false; 
    } 
    else 
    { 
        return true; 
    } 
} 

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

g m i i l Конечно, это не самая моя изящная работа, но я также выбил ее из себя для простоты. Почему я пытаюсь поделиться этим, я не знаю. Я должен был держать это при себе. Как меня зовут? Kage.Sabaku.No.Gaara

прежде чем я отпущу вас, я должен упомянуть тонкие различия между моим приложением формы Windows и настройками по умолчанию. а именно я использую "многобайтовый" набор символов. свойства проекта ... и такие .. дать собаке кость, может быть, голосование?

p.p.s. Ненавижу это говорить, но я сделал одно изменение в host.c, если вы используете 64-битную версию, вы можете сделать то же самое. В противном случае ты сам по себе ..... но моя причина была немного сумасшедшей, тебе не нужно, на самом деле это глупо

typedef unsigned int uinT32; 
#if (_MSC_VER >= 1200)            //%%% vkr for VC 6.0 
typedef _int64 inT64; 
typedef unsigned _int64 uinT64; 
#else 
typedef long long int inT64; 
typedef unsigned long long int uinT64; 
#endif                           //%%% vkr for VC 6.0 
typedef float FLOAT32; 
typedef double FLOAT64; 
typedef unsigned char BOOL8; 
...