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

时间:2017-07-11 15:34:42

标签: c# winforms tesseract

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

}

2 个答案:

答案 0 :(得分:2)

在项目目录(.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共享对象的符号链接。

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

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

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

答案 1 :(得分:1)

Wiki Tesseract

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

如果找到了正确版本的库但无法加载,则日志会告诉您是否是这种情况,那么下一步就是启用绑定错误的日志记录并检查融合日志。请注意,根据我的经验,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输出。