# 一、OCR文字识别
Java OCR学习参考文档 (opens new window)
# OCR引擎
OCR开源项目有如下:
OCR开源项目 | 简介 | 优点 | 劣势 |
---|---|---|---|
Tesseract | 谷歌开发并开源的图像文字识别引擎,使用python开发。 | 1. github上面star非常多,项目非常活跃; 2. 识别的语言和文字非常多; | 1. 不是专门针对中文场景; 2. 相关文档主要是英文,对于阅读和理解起来有一定困难; 3. 学习成本比较高; |
PaddleOCR | 百度开源的中文识别的ocr开源软件 | 1. github上面star非常多,项目非常活跃; 2. 模型只针对中文进行训练, 后面做背书的公司非常强; 3. 相关的中文文档非常齐全; 4. 识别的精确度比较高; | 1. 目前使用的训练模型是基于百度公司自己的PaddlePaddle框架,对于小公司来说并不主流; 2. 所使用深度学习框架为后续其他深度学习无法做很好的铺垫; 3. 项目目整体比较复杂,学习成本较高; |
EasyOCR | 用Python编写的OCR库,用于识别图像中的文字并输出为文本,支持80多种语言。 | 1. 支持的语言也是非常多的,多达80多种; 2. 识别的精确度尚可; | 1. 用Python编写的OCR库,用于识别图像中的文字并输出为文本,支持80多种语言; 2. 从官方的页面体验来说识别的速度较慢; 3. 识别的文字种类多,学习难度较高; 4. 相关的官方文档是基于英文的 |
# 二、tesseract
google
开源, 实现图片文字识别。
支持的格式包括 TIFF、JPEG、GIF、PNG、BMP、JPEG、PDF。
maven引入
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>tesseract-platform</artifactId>
<version>4.1.1-1.5.3</version>
</dependency>
1
2
3
4
5
2
3
4
5
# 三、Tess4J使用
Tess4j 的官网:https://tess4j.sourceforge.net (opens new window) Tess4j 的 Maven 仓库:https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j (opens new window)
Tess4J是对Tesseract OCR API
的Java JNA 封装。使 java 能够通过调用 Tess4J 的 API 来使用 Tesseract OCR。
# maven引入
<!-- Tess4J依赖 -->
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>5.4.0</version>
</dependency>
1
2
3
4
5
6
2
3
4
5
6
# 导入语言库
tessdata 语言库下载地址:https://github.com/tesseract-ocr/tessdata (opens new window)
下载 Tess4J 的所需要的语言库,我下载了 chi_sim.traineddata(中文简体)、eng.traineddata(英文)、jpn.traineddata(日文)三个语言库,存放在 resources 的 data 目录下,其他语言库可根据自己需求选择下载。
注意:如果你下载的语言库只有几十、几百kb,说明你下载异常了,程序启动不了的,解决办法就是连接外网下载。
# 主要实现代码
// 执行OCR识别
private void execute(BufferedImage targetImage) {
try {
File tempFile = new File(tempImage);
if (tempFile == null) {
tempFile.mkdirs();
}
tempFile.mkdirs();
ImageIO.write(targetImage, "jpg", tempFile);
} catch (IOException e) {
e.printStackTrace();
}
File file = new File(tempImage);
ITesseract instance = new Tesseract();
// 设置语言库位置
instance.setDatapath("src/main/resources/data");
// 设置语言
instance.setLanguage(language);
Thread thread = new Thread() {
public void run() {
String result = null;
try {
result = instance.doOCR(file);
} catch (Exception e) {
e.printStackTrace();
}
resultArea.setText(result);
}
};
ProgressBar.show(this, thread, "图片正在识别中,请稍后...", "执行结束", "取消");
}
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
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
当图片内的文字比较清晰时,中文的识别度还是挺高的,特别是图像对比度高的话对于文字识别成功影响很大;而且如果字体较为相近,则容易出错。