从图像中找到文字 -- 开源 OCR 工具 tesseract 使用简介

2022-06-27 16:58:51 浏览数 (1)

1. OCR

OCR 是 Optical Character Recognition (光学字符识别)的缩写,指的是通过检测图像,从而识别出文字的技术。

经过几十年的发展,如今 OCR 技术已经非常成熟,本文我们就来介绍由惠普公司开源的 OCR 算法组件 tesseract 的安装和使用。

2. tesseract 安装

在各个平台上都有着成熟的包管理机制,利用包管理机制直接安装即可,例如在 mac 上,你需要执行下面两个命令:

brew install tesseract brew install tesseract-lang

第一个命令是安装 tesseract 命令执行所需的组件,第二个命令则是安装 tesseract 所需的语言包。

在 mac 上,也许你需要安装 qt、python3.9 等等基础依赖,只要按提示安装即可。

其他环境,例如 Ubuntu、Debian、CentOS 等系统中,只要执行对应的包管理命令即可。

例如在 Ubuntu 系统下,只需执行:

apt-get install tesseract-ocr-all

3. 命令行使用 tesseract

安装 tesseract 后,通过 tesseract --help 命令可以看到说明。

执行以下命令即可:

tesseract imagename outputbase [options...] [configfile...]

例如:

tesseract ~/Downloads/temp.jpg ~/Downloads/temp -l chi_sim

-l 参数用来指定识别的文本是哪种语言,如果是英语可以传递 -l eng.

识别结果就在第二个参数 ~/Downloads/temp.txt 中记录了识别的结果。

4. java 调用 tesseract

安装上述依赖后,就可以通过代码调用了,最简单的就是通过执行系统命令直接调用 tesseract 命令,这里就不赘述了。

下面我们来看看如何通过 java SDK 调用 tesseract 实现 OCR 识别。

4.1 添加 maven 依赖

代码语言:javascript复制
 <dependency>
     <groupId>net.java.dev.jna</groupId>
     <artifactId>jna</artifactId>
     <version>4.1.0</version>
 </dependency>
 <dependency>
     <groupId>net.sourceforge.tess4j</groupId>
     <artifactId>tess4j</artifactId>
     <version>2.0.1</version>
     <exclusions>
         <exclusion>
             <groupId>com.sun.jna</groupId>
             <artifactId>jna</artifactId>
          </exclusion>
     </exclusions>
 </dependency>

4.2 下载语言包

在官方文档网站找到需要识别的语言包:

https://tesseract-ocr.github.io/tessdoc/Data-Files

放到某个目录下, 这里我放到 /opt/tesseract 目录下。

4.3 编写代码调用

代码语言:javascript复制
 public class TessTest {
     public static void main(String[] args) {
         ITesseract instance = new Tesseract();
         File imageFile = new File("/data/images/a.jpg");
         instance.setDatapath("/opt/tesseract");
         instance.setLanguage("chi_sim");
         try {
             long time = System.currentTimeMillis();
             String result = instance.doOCR(imageFile);
             System.out.println(result);
             System.out.println("timeout: "   (System.currentTimeMillis() - time));
         } catch (TesseractException e) {
             System.out.println(e.getMessage());
         }
     }
 }

4.4 遇到的问题

执行上述代码,报错如下:

java.lang.UnsatisfiedLinkError: Unable to load library 'tesseract': Native library (darwin/libtesseract.dylib)

这是因为在 tess4j 的 jar 包中没有包含 darwin/libtesseract.dylib 组件,可以通过升级 jar 包到 5 以上,或是使用其他平台。

解决办法如下:

cd ~/.m2/repository/net/sourceforge/tess4j/tess4j/2.0.1 mkdir darwin jar uf tess4j-2.0.1.jar darwin cp /usr/local/opt/lib/libtesseract.5.dylib darwin/libtesseract.dylib jar uf tess4j-2.0.1.jar darwin/libtesseract.dylib

再次执行即可。

5. 识别效果

附录 -- 参考资料

https://guides.library.illinois.edu/c.php?g=347520&p=4121425

java - Tess4j unsatisfied link error on mac OS X - Stack Overflow

Traineddata Files for Version 4.00 | tessdoc

python 3.x - How do I install a new language pack for Tesseract on Windows - Stack Overflow

tesseract-lang — Homebrew Formulae

0 人点赞