Tess4j 简单尝试

Java 通过 Tess4j 实现 OCR 的简单尝试

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 引入,依赖如下:

1
2
3
4
5
6
<!-- 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

2.3. 编码实现

  • 在项目根目录下新建目录 tessdata,放入中英语言文件,如下图:

  • 编写测试代码,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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 又存在网络安全、价格等因素影响。所以,还需要具体问题具体分析。