适用于Java的OCR库:在Windows 64位上编译tesseract

时间:2011-10-01 17:07:33

标签: java dll dependencies 32bit-64bit ocr

我正在使用ImageJ处理文档图像(业务文档),我正在寻找一个好的OCR库来检索某些地区的文本。

目前我正在使用Asprise,但结果不太可靠。某些字符经常会混淆(0变为O,8 - > B,% - > 0,...),然后存在不应该存在的空白,因此在处理此数据时会遇到很多麻烦。图像的分辨率为1240x1754,我还没有尝试过更高的分辨率,但是我想要检测的最小字符是15像素高,所以我认为图像的质量是足够的。 (顺便说一下,我在原始图像上执行ocr,而不是二进制图像)

在这里看到类似的问题,我注意到经常会推荐tesseract。因为它是用c ++编写的,所以我不确定如何在Java和ImageJ中使用它。

使用Asprise,据我所知,它也是用c ++编写的,只是提供了一个Java包装器,我可以根据BufferedImage执行ocr。所以我认为我可以用tesseract做同样的事情。

1。如何从Java调用tesseract函数?

更新:我尝试使用tesjeract,但是当我执行我的应用程序时,由于

而崩溃
  

UnsatisfiedLinkError:C:\ Windows \ System32 \ tessdll.dll:找不到依赖库

我能够成功编译tesjeract和tesseract 2.04并将tessdll.dll和tesjeract.dll放在c:\ windows \ system32中。我正在使用此静态块来加载库:

static
{
    System.loadLibrary("tessdll");
    System.loadLibrary("tesjeract");
}

如果它是相关的,我使用的是Windows 7 64位。


2。那么如何将BufferedImage转换为tesseract能够使用的格式呢?

解决

这是代码,如果有人感兴趣:(来自audiveris

private ByteBuffer imageToTiffBuffer (BufferedImage image) throws IOException
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageOutputStream     ios = ImageIO.createImageOutputStream(baos);

    // Take the first suitable TIFF writer
    ImageWriter writer = ImageIO.getImageWritersByFormatName("tiff").next();
    writer.setOutput(ios);
    writer.write(image);
    ios.close();

    // allocate() doesn't work
    ByteBuffer buf = ByteBuffer.allocateDirect(baos.size());
    buf.put(baos.toByteArray());

    return buf;
}

3 个答案:

答案 0 :(得分:2)

外部库的位数需要与您的JVM匹配。由于tesjeract是最低的公分母,因此您需要使用32位JVM。

答案 1 :(得分:1)

您可以查看audiveris,我相信Java OMR包使用Tesseract作为工作表的文本部分。

答案 2 :(得分:1)

您可能需要查看两个适用于Tesseract 2.04的Java包装器:Tess4JTesjeract