我想通了,如果您使用的是 Visual Studios 2010 并且正在使用 Windows 窗体/设计器,您可以通过这种方式轻松添加它,没有任何问题
-
将以下项目添加到您的项目中(我警告您一次,不要添加 tesseract 解决方案,或更改您添加的项目中的任何设置,除非您爱恨自己)
ccmain
结构体
ccutil
分类
立方体
角质
听写
图片
libtesseract
nutral_networks
文本
观众
文字记录
您可以添加其他的,但您并不真的希望所有这些都内置到您的项目中,对吗? naaa,分别构建这些
转到您的项目属性并添加 libtesseract 作为参考,您现在可以看到它作为一个项目可见,这将使您的项目快速构建而无需检查 tesseract 中的数百万警告。 【常用属性】->【添加引用】
在解决方案资源管理器中右键单击您的项目,然后单击项目依赖项,确保它依赖于 libtesseract 甚至所有它们,这只是意味着它们在您的项目之前构建。
tesseract 2010 Visual Studio 项目包含许多配置设置,即 release、release.dll、debug、debug.dll,看来 release.dll 设置会生成正确的文件。首先,将解决方案输出设置为 release.dll。单击您的项目属性。然后单击配置管理器。如果不可用,请执行此操作,单击解决方案树中的解决方案属性,然后单击配置选项卡,您将看到项目列表和相关的配置设置。您会注意到您的项目未设置为 release.dll,即使输出是。如果您采用第二条路线,您仍然需要单击配置管理器。然后您可以编辑设置,在您的项目设置上单击新建并将其命名为 release.dll ...与其余设置完全相同,然后从发布中复制设置。对 Debug 执行相同的操作,以便您从调试设置中复制一个 debug.dll 名称。呼……快完成了
不要尝试更改 tesseracts 设置以匹配您的设置....这不会起作用....当新版本发布时,您将无法“扔进去”然后走。接受在这种状态下您的新模式是 Release.dll 和 Debug.dll 的事实。不要紧张...您可以在完成后返回并从您的解决方案中删除项目。
-
猜猜这些库和 dll 是从哪里出来的?在您的项目中,您可能需要也可能不需要添加库目录。有人说要将所有标题转储到一个文件夹中,因此他们只需将一个文件夹添加到包含而不是我。我希望能够删除 tesseract 文件夹并从 zip 中重新加载它而无需额外的工作......并且如果我把代码弄得一团糟,就可以完全准备好一次更新或恢复它。它有点工作,您可以使用代码而不是我的方式进行设置,但是您应该在 2010 tesseract 项目文件夹中包含所有包含头文件的文件夹,不要管它们。
无需向您的项目添加任何文件。只是这些代码行.....我已经包含了一些额外的代码,这些代码可以从一个外部数据集转换为 tiff 友好版本,而无需保存/加载文件。我不是很好吗?
1234563没有额外的编译或错误。完全可调试,一切自然。
如果我没记错的话,我无法避免必须将 2008/lib/ 中的文件复制到我的项目发布文件夹中的事实……。该死的。
我把“functions.h”放在我的项目中
#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;