繁体   English   中英

tesseract-ocr如何包含baseapi.h

[英]tesseract-ocr how to includ baseapi.h

我按照tessesract的形式发现了如何包含baseapi.h的说明。

我在用:

VS2010
版本tesseract 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;

}

形式gide:

将以下文件夹添加到其他包含目录(属性) - 在包含“baseapi.h”后解决文件未找到的问题

的tesseract-3.01 / API

的tesseract-3.01 / ccmain

的tesseract-3.01 / ccutil

的tesseract-3.01 / ccstruct 在此输入图像描述

将以下库添加到“Properties / Linker / Input / Additional Dependancies”以使用Tesseract和Leptonica libs libtesseract.lib; liblept.lib

在此输入图像描述 //将以下路径添加到“Properties / Linker / General / Additional Library Directories”以查找Tesseract和Leptonica libs tesseract-3.01 / vs2010 / Release tesseract-3.01 / vs2008 / lib

在此输入图像描述

我现在试着跑

在此输入图像描述

所以我尝试找到libs libtesseract.lib并替换为libtesseract_tessopt.lib然后运行 在此输入图像描述

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 ==========

有什么已知解决问题的方法吗?

谢谢,

伊兰

![在此处输入图像说明] [6]

![在此输入图像说明] [7]

这就是我编译它所做的:

1.)将所有头文件复制到一个include目录中,因此以后只需将§(TESS_DIR)\\include添加到include目录中。

$(TESS_DIR)\\include\\leptonica标头复制到$(TESS_DIR)\\include\\leptonica

2.)打开vs2010\\tesseract.sln并编译所有配置。 然后将所有lib文件复制到$(TESS_DIR)\\lib\\debug$(TESS_DIR)\\lib\\release 然后将这些目录添加到构建设置中。

3.)将已编译的libtesseract.dllliblept168.dll以及包含eng.traineddata的文件夹tessdata eng.traineddata到项目的Release文件夹中。

4.)将这些库添加为其他依赖项:

libtesseract.lib
liblept168.lib

5.) #include <baseapi.h>

我想通了,如果你正在使用visual studio 2010并使用windows窗体/设计器,你可以通过这种方式轻松添加它,没有任何问题

1)将以下项目添加到您的项目中(我警告您一次,不添加tesseract解决方案,或更改您添加的项目中的任何设置,除非您喜欢讨厌自己)ccmain ccstruct ccutil classify cube cutil dict image libtesseract nutral_networks textord viewer wordrec

你可以添加其他人,但你真的不希望你的项目中包含所有内容吗? naaa,分开建造

2)转到你的项目属性并添加libtesseract作为参考,你现在可以看作它作为一个项目,这将使你的项目快速构建,而无需检查tesseract中的数百万条警告。 [常用属性] - > [添加引用]

3)在解决方案资源管理器中右键单击您的项目并单击项目依赖项,确保它依赖于libtesseract或甚至所有这些依赖项,它只是意味着它们在项目之前构建。

4)tesseract 2010 visual studio项目包含一些配置设置,例如release,release.dll,debug,debug.dll,似乎release.dll设置产生了正确的文件。 首先,将解决方案输出设置为release.dll。 单击您的项目属性。 然后单击配置管理器。 如果不可用,请执行此操作,单击解决方案树中的SOLUTION属性,然后单击配置选项卡,您将看到项目列表和相关配置设置。 你会注意到你的项目没有设置为release.dll,即使输出是。 如果您采用第二条路线,则仍需要单击配置管理器。 然后,您可以编辑设置,在项目设置上单击新建,并将其命名为release.dll ...与其他设置完全相同,并从发布中复制设置。 对Debug执行相同的操作,以便从调试设置中复制debug.dll名称。 哇...差不多完成了

5)不要试图改变tesseracts设置以匹配你的....不会工作....当新版本发布时,你不能只是“扔进去”然后去。 接受这种状态,即你的新模式是Release.dll和Debug.dll。 不要强调......你可以在完成后返回并从解决方案中删除项目。

6)猜猜库和dll的出现位置? 在您的项目中,您可能需要也可能不需要添加库目录。 有人说要将所有标题转储到一个文件夹中,所以他们只需要向包含但不是我添加一个文件夹。 我希望能够删除tesseract文件夹并从拉链重新加载它而无需额外的工作....并且完全准备好一次更新或者如果我弄乱了代码就恢复它。 它有点工作,您可以使用代码而不是我这样做的设置,但是您应该在2010 tesseract项目文件夹中包含所有包含头文件的文件夹并让它们保持不变。

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,." ); 

然后我创建了这个类成员函数:和一个类成员作为输出,不讨厌,我不喜欢返回变量。 不是我的风格。 当我在相信成员函数中使用pix时,不需要销毁pix的内存,我的测试表明这是一种调用这些函数的安全方法。 但无论如何,你可以做任何事情。

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; 
    } 
} 

我不喜欢的一件事就是我在函数外面声明pix的大小。 似乎如果我尝试在函数中做到这一点我有意想不到的结果....如果内存在内部被分配时它会在我离开时被破坏。

gmail当然不是我最优雅的作品,但为了简单起见,我也为了它而扼杀了它。 为什么我懒得分享这个我不知道。 我应该把它留给自己。 我的名字是什么? Kage.Sabaku.No.Gaara

在我让你离开之前,我应该提一下我的Windows窗体应用程序和默认设置之间的细微差别。 即我使用“多字节”字符集。 项目属性...等等。给狗一个骨头,也许投票?

pps我不想这么说但是我对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; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM