在小型C ++项目中如何使用tesseract ocr(或任何其他免费的ocr)?
c
c++
image-processing
ocr
4
0

因此,经过研究后,我听到的唯一可靠的免费OCR选项是Tesseract或CuneiForm。

现在,Tesseract文档简直太恐怖了,它们给您的只是一堆Visual Studio代码(在Windows上对我来说),然后您就可以独立使用它们的API。您所能做的就是使用编译后的exe,然后在tiff图像上使用它。

我期望至少有一个简短的文档,该文档至少告诉您如何拉他们的API调用以使用OCR,但是不,他们的文档中没有类似的东西。

CuneiForm:我下载了它,“很棒”的一切都是俄语的。 :(

那些家伙真的很难举一个小例子,而是向我们提供了一些不相关的信息,这些信息可能有90%的人无法到达,您怎么能不做些小事情就到达那里,而他们却一无所获!

所以我有很多API,但是如果没有解释,我该怎么使用它呢?...也许有人可以向我提供建议和解决方案?我并不是要奇迹,只是向我展示事物的运作方式。

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

我正在研究它..到目前为止,我已经为它生成了DoxyGen代码..这很有帮助。仍在阅读所有文档。

一些对我有帮助的链接:

我从Google代码下载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

希望那些对你有帮助。

收藏
评论

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

  1. 将以下项目添加到您的项目中(我只是警告您一次,请勿添加tesseract解决方案,或更改您添加的项目中的任何设置,除非您喜欢讨厌自己)

    ccmain ccstruct ccutil分类多维数据集cutil dict图像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。单击您的项目属性。然后单击配置管理器。如果不可用,请执行此操作,在解决方案树中单击“解决方案”的属性,然后单击“配置”选项卡,您将看到项目列表和关联的配置设置。您会注意到,即使输出是正确的,您的项目也未设置为release.dll。如果您选择了第二种方法,则仍然需要单击配置管理器。然后,您可以编辑设置,在项目设置上单击“新建”,并将其命名为release.dll ...,与其余设置完全相同,然后从发布版本复制设置。对“调试”执行相同的操作,以便从调试设置中复制一个debug.dll名称。 e ...快完成了

  4. 请勿尝试更改tesseracts设置以使其与您的设置相匹配。...那将行不通....当新版本发布时,您将无法直接“投入”使用。接受以下事实:在这种状态下,您的新模式为Release.dll和Debug.dll。不要紧张...完成后您可以返回并从解决方案中删除项目。

  5. 猜猜库和dll从哪里来?在您的项目中,您可能需要添加库目录,也可能不需要。有人说将所有标头转储到一个文件夹中,因此他们只需要向包含文件中添加一个文件夹即可,而不是我。我希望能够删除tesseract文件夹并从zip文件中重新加载它,而无需进行额外的工作....并且如果我弄乱了代码,可以随时进行更新或恢复它。它的工作量很大,您可以使用代码代替设置(这是我这样做的方式),但是您应该在2010 tesseract项目文件夹中包括所有包含头文件的文件夹,并不要理会它们。

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

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

  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时,不需要破坏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当然不是我最优雅的作品,但是为了简单起见,我也把它彻底搞砸了。我为什么不愿意分享这个我不知道。我应该把它留给我自己。我的名字是什么?影age

在我放手之前,我应该提一下我的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;
收藏
评论

您可能已经放弃了,但是可能还有其他人正在尝试。因此,这是您从tesseract开始的需求:

首先,您应该阅读有关tesseract的所有文档。您可能会发现Wiki有用。

要开始使用API(V 3.0.1,目前在躯干,还宣读了README和更新日志行李箱 ),你应该检查出baseapi.h 。有关如何使用api的文档在此处,每个函数上方都有注释。

对于初学者:

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

(再次,这只是针对初学者。)

您可以在tesseract的社区中查看有关Alred的已回答问题,也可以在此处提问。

收藏
评论

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

简而言之,我发现它与少量示例/文档相混淆,但是我不会指责该产品,哎呀,它是开源的,贡献者可能比市场营销更感兴趣于改进它。

您可以尝试在源代码中四处逛逛,也许花点时间可能会有所了解,但是我完全可以将您的沮丧感与之联系在一起。

祝好运!

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号