【问题标题】:Exception has been thrown by the target of an invocation when using Tesseract ocr使用 Tesseract ocr 时,调用目标引发异常
【发布时间】:2017-07-11 15:34:42
【问题描述】:

我正在编写一个使用 Tesseract 从图像中提取文本的程序。该程序应该从一个目录中获取所有图像,并将它们一一放入图片框中,然后从中提取文本。我已经从这个链接下载了一个经过英语训练的数据,并将其放入 Debug 文件夹 https://github.com/tesseract-ocr/tessdata/blob/master/eng.traineddata
例外是: 这是我的代码:调用的目标已引发异常。
并且 catch 中指示的内部异常是:无法找到平台 x86 的库“liblept172.dll”。

private void button1_Click(object sender, EventArgs e)
{
    Image image;
    string[] images = Directory.GetFiles("E:\\Omar Project\\New", "*.png");
    for (int i = 0; i < images.Length;i++)
    {
        image = Image.FromFile(images[i]);
        pictureBox1.Image = image;
        //ocr = new TesseractEngine(@"tessdata", "eng", EngineMode.Default);
        using (var engine = new TesseractEngine("E:\\Omar Project\\Extracting Text From Image Using Microsoft Office\\Extracting Text From Image Using Microsoft Office\\bin\\Debug\\eng.traineddata", "eng", EngineMode.Default))
        {
          using(var img=Pix.LoadFromFile(images[i]))
          {
              using(var page=engine.Process(img))
              {
                  richTextBox1.Text += page.GetText();
              }
          }
        }
    }

}

【问题讨论】:

  • 而例外是......?
  • @JonSkeet 它已清楚地显示在标题中。
  • 这只是通过反射调用方法提供的包装器。潜在的异常也应该存在。如果您发布完整的堆栈跟踪,包括嵌套异常,帮助您将变得相当简单。 (仅包含异常的消息,而没有任何指示位置、堆栈跟踪或嵌套异常的信息很少。)
  • @JonSkeet 异常发生在这一行: using (var engine = new TesseractEngine("E:\\Omar Project\\Extracting Text From Image Using Microsoft Office\\Extracting Text From Image Using Microsoft Office \\bin\\Debug\\eng.traineddata", "English", EngineMode.Default))
  • 所以这应该是问题所在,以及完整的异常详细信息,包括嵌套异常。

标签: c# winforms tesseract


【解决方案1】:

在您的项目目录(您的 .csproj 文件所在的位置)中创建一个文件夹“x64”或“x86”,并将 liblept1760.so 和 libtesseract400.so 复制到其中。现在您应该能够在 Visual Studio 中看到您的两个文件。您必须将两个文件的“复制到输出目录”(在英语中是这样调用的属性吗?)为“始终”

确保您的容器中安装了以下软件包

apt-get install -y libgif7 libjpeg62 libopenjp2-7 libpng16-16 libtiff5 libwebp6

否则 liblept 的 dlopen 命令将失败,您将收到您提到的错误消息。

如果你的容器中没有安装 liblept 包,只将 .so 文件复制到 x64 目录中,则 libtesseract 的打开命令将失败。

要解决此问题,您必须创建指向您的 liblept 共享对象的符号链接。

只需在您的容器/Dockerfile 中运行

ln -s /app/x64/liblept1760.so /usr/lib/x86_64-linux-gnu/liblept.so.5

确保使用正确的源路径。对于默认的 asp.net 核心 docker 图像和我描述的方式 /app/x64/liblept1760.so 应该可以工作。

【讨论】:

    【解决方案2】:

    Wiki Tesseract

    失败的常见原因有: 未安装 Visual Studio 2015 x86 和 x64 运行时,如主自述文件页面中所述,可在此处找到。 x86 和 x64 版本 leptonica (liblept172.dll) 和 tesseract (libtesseract304.dll) 未复制到 bin 目录中各自的文件夹中。 DotNet 可能报告了错误的体系结构,例如,一个已知问题是,对于使用首选 32 位标志编译的应用程序,在 Windows 64 位操作系统上运行时会报告它在 x64 上运行(参见问题 #55)。一个常见的解决方法是将 cpu 架构更改为 x86。 您在不受支持的架构(例如 ARM)上运行它。 进一步诊断 Tesseract 会将检测到的架构和搜索到的路径写入名为“Tesseract”的 System.Diagnostics 源,这将有助于弄清楚发生了什么。页面末尾提供了示例配置。

    如果找到正确版本的库但加载失败,日志会告诉您是否是这种情况,然后下一步是启用绑定错误日志记录并检查融合日志。请注意,根据我的经验,Windows 可能会将这些错误记录到 Windows 事件日志中,因此可能值得先检查一下。更多细节可以在这里找到:

    https://blogs.msdn.microsoft.com/suzcook/2003/05/29/debugging-assembly-loading-failures/ http://stackoverflow.com/questions/255669/how-to-enable-assembly-bind-failure-logging-fusion-in-net 如果您无法解决问题,请提交新问题,包括库版本、执行代码的操作系统、入口程序的目标架构以及完整标准和跟踪输出的副本。请注意,您需要为前面提到的 Tesseract 源启用 System.Diagnostics 输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 2018-11-08
      • 2018-02-14
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多