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.dll
和liblept168.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的主要内容,如果未能解决你的问题,请参考以下文章
使用Python,OpenCV进行Tesseract-OCR绑定及识别