我正在使用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;
}