文字识别

integrated-development

# 一、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

# 三、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

# 导入语言库

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

当图片内的文字比较清晰时,中文的识别度还是挺高的,特别是图像对比度高的话对于文字识别成功影响很大;而且如果字体较为相近,则容易出错。