目录
- 什么是 Tess4j
-
- OCR
- Tesseract OCR
- Tess4j
- 下载字体库
-
- 中文字体库
- 英文字体库
- 在 SpringBoot 项目中集成 Tess4j
-
- 引入依赖
- 编写配置文件
- 编写配置类
- 测试图像识别功能
-
- 中文
- 英文
- 中英混合
- 注意事项
1. 什么是 Tess4j
1.1 OCR
OCR 是 "Optical Character Recognition"(光学字符识别)的缩写,它是一种技术,能够将不同形式的文档(如纸质文档、PDF 文件或图像)中的打印文本、手写文本或其他类型的数据转换为机器可编辑和可搜索的数据格式,如文本文件或电子文档。
OCR 技术的工作流程通常包括以下几个步骤:
- 图像预处理: 这一步包括图像的获取、二值化、去噪、旋转校正、分割等,以提高后续识别的准确性。
- 文本检测: 在图像中定位文本的位置,通常是通过检测文本的行、单词或字符边界。
- 特征提取: 从图像中提取文本的特征,这些特征将用于识别过程。
- 字符识别: 这一步涉及将提取的特征与已知字符的模式进行匹配,以识别每个字符。
- 后处理: 这一步包括对识别结果进行校对、格式化、布局分析等,以提高整体的可读性和准确性。
OCR 技术的应用非常广泛,包括:
- 文档管理: 将纸质文档转换为电子文档,便于存储和搜索。
- 数据输入: 自动从表格、表单等文档中提取数据,减少手动输入的工作量。
- 内容分析: 从大量文档中提取信息,用于数据分析或知识管理。
- 辅助技术: 帮助视力障碍人士通过语音合成将文本转换为语音。
1.2 Tesseract OCR
Tesseract OCR(光学字符识别)是一个开源的 OCR 引擎,最初由 HP 实验室开发,并在 2005 年开源,之后由 Google 赞助并继续开发。它是目前最准确、最流行的开源 OCR 工具之一。
1.3 Tess4j
Tess4J 是一个 Java 库,它是 Tesseract OCR 引擎的 Java 封装器。Tess4J 允许 Java 开发者轻松地将 Tesseract OCR 的功能集成到他们的 Java 应用程序中。通过 Tess4J,Java 程序可以调用 Tesseract 来执行光学字符识别(OCR)任务,即将图像中的文字转换为可编辑和可搜索的文本格式。
Tess4j 的特点:
- 易于集成: Tess4J 提供了简单的 API,使得在 Java 应用程序中使用 Tesseract 变得非常容易。
- 跨平台: Tess4J 可以在任何支持 Java 的操作系统上运行,包括 Windows、macOS 和 Linux。
- 功能丰富: Tess4J 支持 Tesseract 的所有主要功能,包括多语言识别、自定义训练等。
- 社区支持: 作为一个开源项目,Tess4J 拥有一个活跃的社区,提供支持和更新。
2. 下载字体库
下载地址:
“
2.1 中文字体库
点击 chi_sim.traineddata
中文字体库下载
接着点击下载按钮
下载按钮
2.2 英文字体库
点击 eng.traineddata
英文字体库下载
接着点击下载按钮
英文字体库下载按钮
3. 在 SpringBoot 项目中集成 Tess4j
本次演示的环境为:JDK 17.0.7 + SpringBoot 3.0.2
3.1 引入依赖
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.1.1</version>
</dependency>
3.2 编写配置文件
将 F:/HeiMaTouTiao/tessdata 更换为你存放字体库文件的目录(使用绝对路径)
application.yml
server:
port: 11014
tess4j:
data-path: F:/HeiMaTouTiao/tessdata
chinese-train-data: chi_sim
english-train-data: eng
3.3 编写配置类
Tess4jConfiguration.java
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "tess4j")
publicclass Tess4jConfiguration {
private String dataPath;
private String chineseTrainData;
private String englishTrainData;
public String getDataPath() {
return dataPath;
}
public void setDataPath(String dataPath) {
this.dataPath = dataPath;
}
public String getChineseTrainData() {
return chineseTrainData;
}
public void setChineseTrainData(String chineseTrainData) {
this.chineseTrainData = chineseTrainData;
}
public String getEnglishTrainData() {
return englishTrainData;
}
public void setEnglishTrainData(String englishTrainData) {
this.englishTrainData = englishTrainData;
}
}
4. 测试图像识别功能
4.1 中文
4.1.1 测试代码
import cn.edu.scau.config.Tess4jConfiguration;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
@SpringBootTest
publicclass Tess4jApplicationTests {
@Autowired
private Tess4jConfiguration tess4jConfiguration;
@Test
public void testChinese() throws TesseractException {
long start = System.currentTimeMillis();
ITesseract iTesseract = new Tesseract();
// 设置字体库路径
iTesseract.setDatapath(tess4jConfiguration.getDataPath());
// 设置语言
iTesseract.setLanguage(tess4jConfiguration.getChineseTrainData());
File file = new File("F:/HeiMaTouTiao/tessdata/CaiXuKun-Chinese.png");
// 识别图片
String result = iTesseract.doOCR(file);
long end = System.currentTimeMillis();
System.err.println("耗时:" + (end - start) + "ms");
System.out.println(result);
}
}
4.1.2 测试图片
中文识别测试图片
4.1.3 测试结果
不得不说,图像识别耗时很长
中文识别测试结果
4.2 英文
4.2.1 测试代码
@Test
public void testEnglish() throws TesseractException {
long start = System.currentTimeMillis();
ITesseract iTesseract = new Tesseract();
// 设置字体库路径
iTesseract.setDatapath(tess4jConfiguration.getDataPath());
// 设置语言
iTesseract.setLanguage(tess4jConfiguration.getEnglishTrainData());
File file = new File("F:/HeiMaTouTiao/tessdata/CaiXuKun-English.png");
// 识别图片
String result = iTesseract.doOCR(file);
long end = System.currentTimeMillis();
System.err.println("耗时:" + (end - start) + "ms");
System.out.println(result);
}
4.2.2 测试图片
英文识别测试图片
4.2.3 测试结果
英文识别测试结果
4.3 中英混合
4.3.1 测试代码
中英混合时需要使用中文字体库
@Test
public void testChineseAndEnglish() throws TesseractException {
long start = System.currentTimeMillis();
ITesseract iTesseract = new Tesseract();
// 设置字体库路径
iTesseract.setDatapath(tess4jConfiguration.getDataPath());
// 设置语言
iTesseract.setLanguage(tess4jConfiguration.getChineseTrainData());
File file = new File("F:/HeiMaTouTiao/tessdata/ParagraphWithChineseAndEnglish.png");
// 识别图片
String result = iTesseract.doOCR(file);
long end = System.currentTimeMillis();
System.err.println("耗时:" + (end - start) + "ms");
System.out.println(result);
}
4.3.2 测试图片
中英混合测试图片
4.3.3 测试结果
中英混合测试结果
5. 注意事项
字体库文件的后缀必须是 .traineddata,前缀要与 Java 代码对应
字体库文件命名