1. 概述
1.1. 偶然刷到Java通过Tess4j实现OCR的例子。以前也断断续续看了一些OCR的文章,但总是浅尝辄止,从未上手尝试。如今看到Java版,终于实践了一次。这是本篇文章的由来。
1.2. Tess4j官网介绍:用于 Tesseract OCR API 的 Java JNA 包装器。简单概括:Tesseract是一个流行的开源ocr引擎,Tess4j进行了Java封装,然后我们就可以在Java程序中访问的使用Tesseract进行OCR操作了。
1.3. 简单尝试,不适合真实场景。
2. 实现步骤
2.1. 下载Tess4j
可以从官网下载源码包,也可以通过Maven引入。推荐方式当然是Maven引入,依赖如下:
<!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j -->
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>5.10.0</version>
</dependency>
2.2. 下载语言包tessdata
- 下载地址:共有三个项目tessdata_best、tessdata、tessdata_fast。
- 三个项目区别是:best更准确但是更慢,fast相反。看自己需求吧。
2.3. 编码实现
-
在项目根目录下新建目录tessdata,放入中英语言文件,如下图:
-
编写测试代码,如下:
package xhp.ocr;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import net.sourceforge.tess4j.util.ImageHelper;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
/**
* OCR识别入口
*
* @Author xhp
* @Date 2024/1/22 11:41
**/
public class OcrMain {
public static void main(String[] args) throws IOException {
File imageFile = new File("F://Temp/20240123115455.png");
BufferedImage image = ImageIO.read(imageFile);
image = ImageHelper.convertImageToGrayscale(image);
ITesseract instance = new Tesseract();
// 设置语言文件路径
instance.setDatapath("tessdata");
// 设置语言
instance.setLanguage("chi_sim");
// 设置中文+英文混合语言
// instance.setLanguage("eng+chi_sim");
try {
String result = instance.doOCR(image);
System.out.println(result);
} catch (TesseractException e) {
System.err.println(e.getMessage());
}
}
}
- 执行调试,可以顺利读取中文和英文图片。
3. 总结
3.1. 优点:实现比较简单。
3.2. 缺点:识别准确率受字体颜色、大小、清晰度、干扰度、扭曲、倾斜等度影响;对表格不能很好识别或无法定位还原表格列;
3.3. 适合读取简单清晰的图片。识别准确率可以通过自己训练数据来提高。当然真实项目场景里也不会这么简单,应该结合图片处理和更复杂的api去实现。
3.4. 对比了一下Paddle OCR,个人觉得Paddle更好点。但是本地部署麻烦了点,如果调用在线API又存在网络安全、价格等因素影响。所以,还需要具体问题具体分析。