1. 基本概念
1.1 Tesseract
Tesseract 是一款基于 C 语言开发并开源的光学识别工具,提供底层的文字识别能力。
1.2 Tess4J
Tess4J 是对 Tesseract OCR API 的 Java 封装,有了 Tess4J 之后 Java 就可以直接调用本地安装的 Tesseract 进行文字识别。
2. 安装
2.1 Tesseract 安装
Tesseract 官方本身没有提供 Windows 的安装包,但是在他的官网上有一个第三方封装的安装包的链接。选择最新的 exe
文件进行安装就可以了,可以避开带有 dev 字样的包。下载完成后一路下一步就可以了。
2.2 Tesseract 环境变量配置
Tesseract 一共有两个环境变量需要配置
- 在系统环境变量中的
Path
中添加 Tesseract 的安装目录,例如c:\Tesseract-OCR
。 - 在系统环境变量中添加一个新的变量,变量名为
TESSDATA_PREFIX
,变量值为 Tesseract 安装目录下的 tessdata 目录的完整路径,例如c:\Tesseract-OCR\tessdata
。
2.3 语言包安装
Tesseract 的安装包里自带的语言只有英文,如果需要用于识别中文需要自己下载语言包。语言包也可以在 Github 上下载,中文的语言包文件名为 chi_sim.traineddate
,这其实是一个训练后的文件,但是对于我这样的新手来说 “语言包” 可能更好理解。
2.4 安装验证
安装完成后通过在控制台调用 Tesseract 来进行验证。
- 在控制台输入
tesseract -v
命令,如果返回 Tesseract 的版本,说明安装和配置都成功了。 - 在控制台输入
tesseract --list-langs
可以看到当前 Tesseract 已经安装的语言包。
3. TesseractOCR 使用
3.1 命令行使用
安装完 TesseractOCR 的安装之后可以使用命令行进行调用。
tesseract {img} {result} -l {lang}
- img:需要识别的图片的完整路径,如
c:\1.png
- result:识别结果保存的文件路径,如
c:\result.txt
- lang:图片中的语言,就是语言包的前缀,如中文就是
chi_sim
,英文就是eng
。
下面给出一个完整的样例。
tesseract c:\1.png c:\result.txt -l chi_sim
如果执行命令时提示 找不到命令
或 不是内部命令
,那就是环境变量没有配置对。
3.2 Tess4J 的使用
3.2.1 通过 Maven 引入包
<dependency> <groupId>net.sourceforge.tess4j</groupId> <artifactId>tess4j</artifactId> <version>4.5.3</version>
</dependency>
3.2.2 编写测试代码
public static void main(String[] args) throws Exception { Tess4jTest test = new Tess4jTest(); //创建ITesseract接口的实现实例对象 ITesseract iTesseract = new Tesseract(); //默认识别英文 //如果需要识别英文之外的语种,需要指定识别语种,并且需要将对应的语言包放进项目中 iTesseract.setLanguage("chi_sim+eng"); for (String fileName: test.getFileNames()) { // 指定本地图片 File img = new File(test.getImgPath() + fileName); //开始识别时间 long startTime = System.currentTimeMillis(); //识别结果 String ocrResult = iTesseract.doOCR(img); // 输出识别结果 System.out.println("耗时:" + (System.currentTimeMillis() - startTime) + "ms"); System.out.println("识别结果: \n" + ocrResult ); } } public String getImgPath(){ return this.getClass().getClassLoader().getResource("").getPath() + "/test-img/"; } public String[] getFileNames() { return new String[]{"1.png"}; }
这里直接用本地图片进行测试,将图片放到项目中的 Resource
路径下的 test-img
目录下。这个 test-img
目录是要自己创建的。
3.2.3 遇到的问题
如果在执行代码过程中出现以下错误提示,说明环境变量没有设置,需要在系统环境变量中添加 TESSDATA_PREFIX
,值是 TesseractOCR 安装目录下 tessdata 的路径。tessdata 目录是 TesseractOCR 的语言包目录。
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
Error opening data file ./eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory.
Failed loading language 'eng'
Tesseract couldn't load any languages!
Warning: Invalid resolution 0 dpi. Using 70 instead.
Exception in thread "main" java.lang.Error: Invalid memory accessat com.sun.jna.Native.invokePointer(Native Method)at com.sun.jna.Function.invokePointer(Function.java:497)at com.sun.jna.Function.invoke(Function.java:441)at com.sun.jna.Function.invoke(Function.java:361)at com.sun.jna.Library$Handler.invoke(Library.java:265)at jdk.proxy2/jdk.proxy2.$Proxy2.TessBaseAPIGetUTF8Text(Unknown Source)at net.sourceforge.tess4j.Tesseract.getOCRText(Tesseract.java:517)at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:359)at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:228)at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:195)at test17.Tess4jTest.main(Tess4jTest.java:29)
4. 测试结果
4.1 识别率
Tesseract 在没有经过特殊训练的情况下,对简单图片的识别率还是可以的,但当图片变得复杂后几乎无法正常识别。这里的简单图片是指白底黑字,字是非手写的常用字体,并且排版工整。
4.2 性能
Tesseract 的识别性能比 PaddleOCR 稍强,但是差距不大,简单图片大约相差 100-200 ms。几乎可以忽略不计。
4.3 使用难度
Tesseract 在 Windows 上安装非常简单,使用第三方封装的安装包可以直接图形化界面安装。Tesseract 有多语言的 API 封装,对于开发来说就是调用 API,难度不大。但是如果要自己做训练就有一定的学习成本。
参考资料
Tesseract的Github
Tess4J的Github
Tesseract OCR V5.0安装教程(Windows)
Please make sure the TESSDATA_PREFIX environment variable is set to your “tessdata“ directory.
从头开始训练自己的 Tesseract 5 LSTM 识别库(超详细)
RAG 文件处理(2):图片字符的识别 tesseract-ocr、paddleocr、CnOCR
JAVA使用Tess4J进行ocr识别