我如何在小型c ++项目中使用tesseract ocr(或任何其他免费的ocr)?

所以我研究后听到的是,唯一的免费的OCR选项是Tesseract或CuneiForm。

现在,Tesseract文档是非常可怕的,他们给你的只是一堆Visual Studio代码(对于我来说,在Windows上),从那里你可以在自己的API的海洋中独自使用。 所有你能做的就是使用编译的exe,然后在tiff图像上使用它。

我期望至less有短的文档,告诉你如何拉他们的API调用使用OCR至less为一个小例子,但不,在他们的文档中没有这样的。

CuneiForm:我下载了它,“伟大”一切都是用俄语。 🙁

这些家伙真的很难拉扯一个小例子,而是提供给我们大量90%的人无法达到的不相关的信息,你怎么能到达那里,而不是从小事情开始,他们没有解释!

所以我有一堆的API,但如果解释无处,我该如何使用它?也许有人可以提供给我的build议和解决scheme? 我不是要求一个奇迹,只是一些小的东西给我看看事情是如何运作的。

你可能已经放弃了,但也有可能还有其他人在尝试。 所以这里是你需要开始tesseract:

首先你应该阅读关于tesseract的所有文档。 你可能会发现有用的是维基 。

要开始使用API​​(v 3.0.1,目前在trunk中,请阅读trunk中的README和ChangeLog),你应该检查baseapi.h 关于如何使用API​​的文档就在那里,每个函数上面都有注释。

对于初学者:

  • 包括baseapi.h和构造TessBaseAPI对象
  • 调用Init()
  • 一些可选的像
    • SetVariable()函数改变一些参数。 如果使用PrintVariables()函数将它们打印到文件中,您可以看到所有参数及其值。
    • 使用SetPageSegMode()更改分段模式。 告诉tesseract什么样的图像你是OCR代表 – 块或文字,字或字符的行。
  • SetImage()
  • GetUTF8Text()

(再次,这只是为了初学者。)

你可以检查tesseract的社区的答案问题或问你自己在这里 。

我正在挖掘它..到目前为止,我已经生成了DoxyGen代码..这是帮助。 仍然阅读所有的文档。

一些链接,帮助我:

  • 谷歌开发团队充满了从绝望的开发人员破碎的例子
  • 一个稍微老的(v2.0)黑客tesseract如何

任何我从谷歌代码下载svn: http : //code.google.com/p/tesseract-ocr/

并做了安装,然后使用doxygen生成我自己的API参考文档。 很有用。

我做的方式是:

  1. 我使用了“make install”,并在/ usr / include / tesseract中放了一些东西
  2. 我把那个目录复制到了我的家里
  3. doxygen -g doxygen.conf; #生成一个doxygen文件
  4. 通过它生成的文件,并设置输出目录和项目名称或任何。 我使用“doxy-dox”作为我的输出目录
  5. doxygen -g doxygen.conf
  6. 铬浏览铬浏览器doxy-doc / html / index.html

希望有点帮助。

我想通了,如果你正在使用视觉工作室2010,并使用Windows窗体/设计器,您可以轻松地添加它,这样没有问题

  1. 将以下项目添加到您的项目中(我曾经警告过,不要添加tesseract解决方案,或者更改您添加的项目中的任何设置,除非您喜欢讨厌自己)

    ccmain ccstruct ccutil分类立方体cutil字典图像libtesseract nutral_networks textord查看器wordrec

你可以添加其他的,但你并不是真的想要你的项目中内置的所有内容吗? naaa,分别建立这些

  1. 去你的项目属性,并添加libtesseract作为参考,现在可以看到它作为一个项目,这将使得您的项目建设速度快,没​​有检查tesseract中的数百万警告。 [共同属性] – > [添加引用]

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

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

  4. 不要试图改变tesseracts设置来匹配你的….不会工作….当新版本出来,你将无法只是“扔它”,并去。 接受在这种状态下您的新模式是Release.dll和Debug.dll的事实。 不要压力太大,你可以在完成时返回,并从解决方案中删除项目。

  5. 猜猜图书馆和dll在哪里出来? 在您的项目中,您可能需要或可能不需要添加库目录。 有些人说所有的标题转储到一个文件夹,所以他们只需要添加一个文件夹到包括但不是我。 我希望能够删除tesseract文件夹,并从zip中重新加载它,而无需额外的工作….并完全准备好一步更新或恢复它,如果我弄乱了代码。 它的一些工作,你可以通过代码来代替设置,但是你应该在2010 tesseract项目文件夹中包含所有包含头文件的文件夹,并让它们保持独立。

  6. 没有必要添加任何文件到您的项目。 只是这些代码行…..我已经包括了一些额外的代码,从一个外国数据集转换到TIFF友好的版本,无需保存/加载文件。 我不好吗?

  7. 现在你可以完全调试debug.dll和release.dll,一旦你已经成功地将其构建到你的项目,即使你可以删除所有添加的项目,这将是peeerfect。 没有额外的编译或错误。 完全可调试,全部自然。

  8. 如果我没有记错,我不能解决这个事实,我不得不将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; } } 

我不喜欢的一件事就是我在函数外面声明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; 

Marko,我也尝试使用Tesseract编写一个快速的C ++应用程序,并遇到同样的问题。

简而言之,我发现它与小例子/文档混淆,但我没有错的产品,嘿,它是开源的,贡献者可能更感兴趣的是改进而不是营销。

你可以尝试在源代码中查找,可能花时间可能会理解,但我可以完全与你的挫折相关。

祝你好运!