我正在使用 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: Can't find dependent libraries
我能够成功编译 tesjeract 和 tesseract 2.04 并将 tessdll.dll 和 tesjeract.dll 放在 c:\windows\system32 中。我正在使用这个静态 block 来加载库:
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;
}
最佳答案
外部库的位数需要与您的 JVM 匹配。由于 tesjeract 是最小公分母,因此您需要使用 32 位 JVM。
关于java - Java : compiling tesseract on Windows 64-bit 的 OCR 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7621700/