OCR图像识别技术的JAVA实现

最近有个需求需要用图像识别,学习记录一下。

目前网络上的开源的图像识别技术有很多,例如 OCRE(OCR Easy)、Clara OCR、OCRAD、TESSERACT-OCR 等。

今天本blog将记录下tesseract-ocr的JAVA实现,便于以后查阅使用。

开源 ocr 引擎

https://github.com/search?q=ocr 直接 github 搜索,可以看到对应的 ocr 开源框架。

我们本次直接以排名第一的 TESSERACT-OCR 作为例子。

TESSERACT-OCR 安装

https://github.com/tesseract-ocr/tesseract/wiki 这里是安装页面的 wiki。

本次测试的环境为 windows10,所以下载 windows 相关的安装包

windows 下载地址

所有的文件列表

我这里直接下载了 tesseract-ocr-w64-setup-v4.0.0.20181030.exe

安装

安装完毕后,目录下:

直接双击 exe,然后安装。

image

  • 指定安装特定语言包

这里我们安装一下中文的语言训练包。

【chinese】相关的四个,简体,繁体(分别对应的默认和垂直。)

比较悲催的是全部下载失败。

  • 安装路径

使用默认路径:

  [plaintext]
1
C:\Program Files (x86)\Tesseract-OCR
  • 结果
  [plaintext]
1
2
3
4
5
6
7
8
9
10
λ ls ambiguous_words.exe* libcairo-2.dll* libgomp-1.dll* libpangocairo-1.0-0.dll* libwebp-7.dll* tesseract.exe* classifier_tester.exe* libexpat-1.dll* libharfbuzz-0.dll* libpangoft2-1.0-0.dll* libwinpthread-1.dll* tesseract-uninstall.exe* cntraining.exe* libffi-6.dll* libintl-8.dll* libpangowin32-1.0-0.dll* lstmeval.exe* text2image.exe* combine_lang_model.exe* libfontconfig-1.dll* libjbig-2.dll* libpcre-1.dll* lstmtraining.exe* unicharset_extractor.exe* combine_tessdata.exe* libfreetype-6.dll* libjpeg-8.dll* libpixman-1-0.dll* merge_unicharsets.exe* wordlist2dawg.exe* dawg2wordlist.exe* libgcc_s_seh-1.dll* liblept-5.dll* libpng16-16.dll* mftraining.exe* zlib1.dll* doc/ libgif-7.dll* liblzma-5.dll* libstdc++-6.dll* set_unicharset_properties.exe* iconv.dll* libglib-2.0-0.dll* libopenjp2.dll* libtesseract-4.dll* shapeclustering.exe* libbz2-1.dll* libgobject-2.0-0.dll* libpango-1.0-0.dll* libtiff-5.dll* tessdata/
  • 验证版本
  [plaintext]
1
2
3
4
>tesseract --version tesseract v4.0.0.20181030 leptonica-1.76.0 libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 1.5.3) : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libwebp 0.6.1 : libopenjp2 2.2.0

转换测试

  [plaintext]
1
tesseract D:\code\ocr\src\main\resources\hello.png 1

报错

  [plaintext]
1
2
3
4
5
6
C:\Users\binbin.hou>tesseract D:\code\ocr\src\main\resources\hello.png 1 Error opening data file C:\Program Files (x86)\Tesseract-OCR/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! Could not initialize tesseract.
  • 配置环境变量

简单就是说把tessdata拷贝到exe的所在目录,或者设置 TESSDATA_PREFIX 环境变量

(1)设置系统变量 TESSDATA_PREFIX 值为安装路径对应的 data 路径 C:\Program Files (x86)\Tesseract-OCR\tessdata

(2)设置 exe 路径 C:\Program Files (x86)\Tesseract-OCR 添加到 path

然后重启电脑即可。

  • 再次验证
  [plaintext]
1
2
C:\Users\binbin.hou>tesseract D:\code\ocr\src\main\resources\hello.png 1 Tesseract Open Source OCR Engine v4.0.0.20181030 with Leptonica

其中文本信息为:

  [plaintext]
1
hello ocr

训练集数据

tessdata 这个文件夹用来放各种语言的训练集合数据。

因为中文下载失败,目前里面只有英文的:

  [plaintext]
1
2
3
λ ls configs/ eng.user-patterns jaxb-api-2.3.1.jar pdf.ttf piccolo2d-extras-3.0.jar ScrollView.jar eng.traineddata eng.user-words osd.traineddata piccolo2d-core-3.0.jar script/ tessconfigs/

各种语言库的下载地址 tessdata

本节暂时不讨论中文相关的处理。

代码测试

maven 引入

实际原理就是利用 java 指定 cmder 进行调用,为了方便,我们直接引入一个 jar 便于调用。

  [xml]
1
2
3
4
5
6
7
<dependencies> <dependency> <groupId>net.sourceforge.tess4j</groupId> <artifactId>tess4j</artifactId> <version>4.2.1</version> </dependency> </dependencies>

这里的 tess4j 的版本和我们安装的版本是有对应关系的,个人就是因为这个问题排查了半天。

这个 jar 使用的 jdk 为 1.8,请使用 jdk 1.8+ 测试,否则会报错 Unsupported major.minor version 52.0

应该有适合 jdk1.7 的版本,时间有限,后面尝试。

图片

直接以如下图片做测试:

image

测试代码

  [java]
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
package com.github.houbb.ocr; import net.sourceforge.tess4j.ITesseract; import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.TesseractException; import java.io.File; public class Main { public static void main(String[] args) throws TesseractException { ITesseract instance = new Tesseract(); // 指定训练数据集合的路径 instance.setDatapath("C:\\Program Files (x86)\\Tesseract-OCR\\tessdata"); // 指定识别图片 File imgDir = new File("D:\\code\\ocr\\src\\main\\resources\\hello.png"); long startTime = System.currentTimeMillis(); String ocrResult = instance.doOCR(imgDir); // 输出识别结果 System.out.println("OCR Result: \n" + ocrResult + "\n 耗时:" + (System.currentTimeMillis() - startTime) + "ms"); } }
  • 结果
  [plaintext]
1
2
3
4
5
6
OCR Result: hello ocr 耗时:1530ms Process finished with exit code 0

个人理解这个耗时其实意义不是很大,因为一开始需要加载训练集合文本,所以耗时会较多。

总结

本节使用 java 实现了最基本的文本识别,应用场景还是很多的,等待大家的自己挖掘。

当然默认这里是不支持中文的,下一节将进行中文的实现学习。

拓展阅读

ocr 实现中文识别

参考资料

tesseract-ocr v4.0.0

Java 实现OCR 识别图像文字(手写中文)—-tess4j

Java OCR 图像智能字符识别技术[可识别中文]

环境配置

Windows下通过CMD脚本更改环境变量并马上生效

windows系统cmd命令行设置、查看、更改环境变量

Windows下setx命令

错误

Please make sure the TESSDATA_PREFIX environment variable is set to your “tessdata” directory.

解决:actual_tessdata_num_entries_ <= TESSDATA_NUM_ENTRIES:Error:Assert failed:in file ....\ccutil\tessdatamanager.cp p, line 50

stackoverflow