【问题标题】:tessnet2 fails to loadtessnet2 加载失败
【发布时间】:2011-01-04 10:40:40
【问题描述】:

我在 windows XP 上使用 tessnet2 包装器到 Tesseract 2.04 源, 将其配置为与 x86 一起使用。

TessarctTest 项目主要功能包含:

        Bitmap bmp = new Bitmap(@"C:\temp\New Folder\dotnet\eurotext.tif");
        tessnet2.Tesseract ocr = new tessnet2.Tesseract();
        // ocr.SetVariable("tessedit_char_whitelist", "0123456789");
        ocr.Init(@"C:\temp\tessdata", "eng", false);
        // List<tessnet2.Word> r1 = ocr.DoOCR(bmp, new Rectangle(792, 247, 130, 54));
        List<tessnet2.Word> r1 = ocr.DoOCR(bmp, Rectangle.Empty);
        int lc = tessnet2.Tesseract.LineCount(r1);

当我尝试运行程序时,它在 ocr.Init 内的以下行崩溃

int result = m_myTessBaseAPIInstance->InitWithLanguage((char *)_tessdata.ToPointer(), NULL, (char *)_lang.ToPointer(), NULL, numericMode, 0, NULL);

有人有想法吗?

欣赏!

【问题讨论】:

  • ocr 类是否是这个 DLL 代码的包装器,在我看来是 C/C++?如果是,那么 Init 包装器方法的参数是否与 InitWithLanguage 函数的参数匹配?
  • 顺便问一下,您能否为我们的同胞提供更多信息?提示,线索被亲切地接受了......
  • 当我尝试在“InitWithLanguage”中设置断点时,我无法...我收到消息:“断点不会被命中。没有可执行代码与此行相关联。可能的原因包括: 条件编译或编译器优化。”
  • tessnet2 是 C++ DLL 吗?如果是这种情况,那么它是在发布模式下构建的本机程序集,因此您看不到任何可执行代码。你在使用 P/Invoke 吗?
  • 我刚刚用谷歌搜索了 tessnet2 并发现了这个网站...pixel-technology.com/freeware/tessnet2 提到了内存泄漏...也许这可能是一个促成因素?

标签: c# crash tessnet2


【解决方案1】:

如果您在所有这些操作后仍然遇到问题,请确保您在使用 tessnet2 时下载了正确的语言文件

您需要Tesseract(2.00 及更高版本)的英语语言数据,而不是Tesseract 3.01 的英语语言数据。我希望这可以为您节省几个小时! :)

【讨论】:

  • 谢谢,亚当,这解决了我在尝试使用 3.0 版的语言文件时的问题。当然,Tessnet2 基于 Tesseract 2.0。
  • 确实,这是一个非常简单的错误,以至于我发现自己在查看代码和库以及各种非常简单的错误文件时。很高兴它有帮助!
  • 但是如果你想为你自己的字体训练它怎么办?我还应该下载语言数据文件吗?我应该把它放在哪里?
  • 这对我不起作用。我不知道该怎么办了:(
【解决方案2】:

对于那些尝试在 C# 中将 Tessnet2 程序集用于 Tesseract OCR 引擎并且遇到Tesseract.Init() 方法导致您的应用程序崩溃的问题的人 - 我找到了一个可能的原因。

首先,我假设您的文件如下:

bin\Debug\MyDotNetApp.exe
bin\Debug\tessdata\eng.DangAmbigs
bin\Debug\tessdata\eng.freq-dawg
bin\Debug\tessdata\eng.inttemp
bin\Debug\tessdata\eng.pffmtable
bin\Debug\tessdata\eng.unicharset
bin\Debug\tessdata\eng.user-words
bin\Debug\tessdata\eeng.word-dawg

并且正在使用它进行初始化:

using (var ocr = new tessnet2.Tesseract())
{
    ocr.Init(null, "eng", false);
    ...
}

理论上应该可以。对我来说,它确实有效 - 但它并没有突然之间......即使我没有改变任何会影响它的东西。

对我来说,解决方法是搜索注册表(使用 regedit)并删除对 tesseract 的所有引用。我认为在安装 Tesseract 3.00 安装程序 (tesseract-ocr-setup-3.00.exe) 时可能创建了一些可疑条目。

当我删除这些条目并重新启动时(我曾尝试在删除 reg 条目之前重新启动,仅供参考),一切都恢复了。

是注册表项导致了问题吗?谁知道。但它确实解决了我的问题。

【讨论】:

  • dkr88,谢谢你的回答,因为它解决了我的问题。我完全按照您发布的内容做了,现在一切正常!
  • 做了同样的事情,但仍然没有为我工作。我现在很困惑。我已经为自己的字体进行了培训。卸载了 tesseract 3.01v 并使用此注册表清理软件清理了注册表。有人能告诉我应该在 tessdata 文件夹中包含哪些文件吗?顺便说一句,我已经为自己的字体训练了 tesseract。我只是很困惑我应该在其中包含什么。
  • 谢谢。这解决了我的问题。我没有删除任何注册表我只是卸载了 tesseract3,它自行清理了注册表并需要重新启动。
  • @dkr88 : 非常感谢..我按照你的代码... List result = ocr.DoOCR(image, Rectangle.Empty); int lc = tessnet2.Tesseract.LineCount(result); MessageBox.Show(""+lc);字符串 imgText = ""; foreach (tessnet2.Word 结果中的单词) { imgText = imgText + " " + word.Text.ToString().Trim(); } MessageBox.Show("图像文本为:" + imgText);但它显示 lc=1 和 word.text=~。实际上,我的图像包含超过 10 行英文内容。那么,如何从我的图像中提取这些内容?
【解决方案3】:

项目+属性,调试选项卡,向下滚动,勾选“启用非托管代码调试”复选框。现在您可以设置断点并对其进行调试。


如果您的 IDE 不支持混合模式调试,您可以使用this post 中概述的技术附加调试器。

【讨论】:

  • @nobugz:这是一件非常重要的事情,但经常被忽视。 +1 来自我.. :)
【解决方案4】:

确保您的 tessdata 文件夹 (C:\temp\tessdata) 包含英语语言数据文件。这些文件是:eng.DangAmbigs、eng.freq-dawg、eng.inttemp、eng.normproto、eng.pffmtable、eng.unicharset、eng.user-words、eng.word-dawg。从tesseract downloads.下载文件要下载的文件是tesseract-2.00.eng.tar.gz。

【讨论】:

    【解决方案5】:

    就我而言,dkr88 的回答完成了这项工作,非常感谢。我猜想在之前将 tesseract 作为独立安装时存在一些依赖项损坏。此外,OCR 质量似乎比 MODI 更好,尽管后者在更极端的情况下工作(垂直文本)。

    我现在对 tessnet2 很满意。只有一个缺点:我需要更改我的 app.config(如互联网上所述)并添加以下内容:

    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0"/>
    </startup>
    

    【讨论】:

      【解决方案6】:

      我的问题是我没有以管理员权限运行应用程序。

      当我右键单击“运行身份”并选择“本地管理员”时,它起作用了。

      【讨论】:

        【解决方案7】:

        就我而言,我进行了以下更改以使其正常工作:)

        1. 已下载 https://tesseract-ocr.googlecode.com/files/tesseract-2.00.eng.tar.gz
        2. 已将 tessdata 文件夹粘贴到我的 Debug 文件夹中
        3. 并做了以下代码更改

        ocr.Init("D:\MyApplication\MyApplication\Debug", "eng", false);

        ocr.Init(null, "eng", false);

        【讨论】:

          【解决方案8】:

          在我的情况下,我将 tessdata 文件设置为始终复制,然后它没有在 init 行崩溃。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-03
            • 2020-10-26
            • 2013-02-08
            • 2014-01-31
            • 2020-03-18
            相关资源
            最近更新 更多