繁体   English   中英

使用Tesseract ocr时,调用目标抛出了异常

[英]Exception has been thrown by the target of an invocation when using Tesseract ocr

我正在编写一个程序,使用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();
              }
          }
        }
    }

}

在项目目录(.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的open命令将失败。

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

只需在容器/ Dockerfile中运行即可

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

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

Wiki Tesseract

失败的常见原因是:未安装Visual Studio 2015 x86和x64 Runtime,详见主要自述页面,可在此处找到。 x86和x64版本leptonica(liblept172.dll)和tesseract(libtesseract304.dll)未复制到bin目录中的各自文件夹。 DotNet可能会报告错误的体系结构,例如一个已知的问题是,对于使用prefer 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输出,如前所述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM