tesseract-ocr 如何包含 baseapi.h

Posted

技术标签:

【中文标题】tesseract-ocr 如何包含 baseapi.h【英文标题】:tesseract-ocr how to includ baseapi.h 【发布时间】:2011-12-30 12:20:10 【问题描述】:

我按照我在 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;


表格引导:

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

tesseract-3.01/api

tesseract-3.01/ccmain

tesseract-3.01/ccutil

tesseract-3.01/ccstruct

将以下库添加到“属性/链接器/输入/附加依赖项”,以便使用 Tesseract 和 Leptonica 库 libtesseract.lib;liblept.lib

// 将以下路径添加到“Properties/Linker/General/Additional Library Directories”以查找 Tesseract 和 Leptonica 库 tesseract-3.01/vs2010/Release tesseract-3.01/vs2008/lib

我现在试着跑

所以我尝试找到库 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]: i.stack.imgur.com/U1fph.png [2]: i.stack.imgur.com/Gxmtm.png [4]: i.stack.imgur.com/1Ax5V.png [5]: i.stack.imgur.com/AUCyw.png [3]: i.stack.imgur.com/cNQoK.png */ 【参考方案1】:

这是我为编译它所做的:

1.) 将所有头文件复制到一个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 复制到项目的Release 文件夹中。

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

libtesseract.lib
liblept168.lib

5.) #include <baseapi.h>

【讨论】:

我找到了另一个解决方案使用 vs2010 转到您的 release-3.01\vs2010 打开项目并按构建解决方案,现在它将按顺序将以下库添加到“属性/链接器/输入/附加依赖项”中使用 Tesseract 和 Leptonica 库 libtesseract.lib;liblept.lib【参考方案2】:

我想通了,如果您使用的是 Visual Studios 2010 并且正在使用 Windows 窗体/设计器,您可以通过这种方式轻松添加它,没有任何问题

1) 将以下项目添加到您的项目中(我警告您一次,不要添加 tesseract 解决方案,或更改您添加的项目中的任何设置,除非您爱恨自己) ccmain 结构体 ccutil 分类 立方体 角质 听写 图片 libtesseract nutral_networks 文本 观众 文字记录

您可以添加其他的,但您并不真的希望所有这些都内置到您的项目中,对吗? naaa,分别构建这些

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) 猜猜这些库和 dll 是从哪里出来的?在您的项目中,您可能需要也可能不需要添加库目录。有人说将所有标题转储到一个文件夹中,因此他们只需将一个文件夹添加到包含而不是我。我希望能够删除 tesseract 文件夹并从 zip 中重新加载它而无需额外的工作......并且如果我把代码弄得一团糟,就可以完全准备好一次更新或恢复它。它有点工作,您可以使用代码而不是我的方式进行设置,但是您应该在 2010 tesseract 项目文件夹中包含所有包含头文件的文件夹,不要管它们。

7) 无需向您的项目添加任何文件。只是这些代码行.....我已经包含了一些额外的代码,这些代码可以从一个外部数据集转换为 tiff 友好版本,而无需保存/加载文件。我不是很好吗?

8) 现在您可以在 debug.dll 和 release.dll 中进行完全调试,一旦您成功将其构建到您的项目中,即使您可以删除所有添加的项目,它也将是完美的。没有额外的编译或错误。完全可调试,一切自然。

9) 如果我没记错的话,我无法避免必须将 2008/lib/ 中的文件复制到我的项目发布文件夹中的事实……。该死的。

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 的内存,并且我的测试表明这是调用这些函数的安全方法。但无论如何,你可以做任何事情。

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 a i l 当然不是我最优雅的作品,但为了简单起见,我也把它彻底搞砸了。为什么我费心分享这个我不知道。我应该把它留给自己。我的名字是什么? Kage.Sabaku.No.Gaara

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

p.p.s.我不想这么说,但是如果您使用 64 位,我对 host.c 进行了更改,您也可以这样做。否则你自己......但我的理由有点疯狂,你不必这样做,实际上有点傻

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; 

【讨论】:

以上是关于tesseract-ocr 如何包含 baseapi.h的主要内容,如果未能解决你的问题,请参考以下文章

如何提高Tesseract-OCR的识别精度

如何让 tesseract-ocr 从屏幕上的坐标读取?

求易语言调用tesseract-OCR例子

使用Python,OpenCV进行Tesseract-OCR绑定及识别

tesseract-ocr,tesseract,pytesseract在windows下怎么安装

Tesseract-OCR安装以及Training简明教程