Tess4J for Java

近期因工作安排,开始接触OCR。在macOS环境下使用Tess4J这个OCR库时,踩了很多坑。

需记录下来


Tess4J简介

Tesseract-OCR支持中文识别,并且开源和提供全套的训练工具,是快速低成本开发的首选。而Tess4J则是Tesseract在Java PC上的应用。在英文和数字识别中性能还是不错的。

因为 tess4j.jar 中没有包含涉及到macOS的库,所以在项目中导入前,需要提前做一些配置。笔者没有试过在Windows或者Linux环境下使用Tess4J,所以暂时不知道其他系统上是否需要做相同的配置。

macOS的本地配置

首先需要通过 homebrew 安装 Tesseract 引擎。

1
brew install tesseract

默认下的语言包含”eng”,”osd”,和”snum”,并不包含中文。如果需要检测中文,需要额外下载语言包

安装成功之后执行下面的语句来获得当前安装的版本号。

1
brew info tesseract

当前笔者安转的版本为 5.1.0。记住这个版本号,在之后的操作中会涉及到。如果按照笔者的流程配置时,记得后续步骤将版本号替换成自己安装的版本号。

下一步依次执行下列命令对 maven cached jar 文件。记住将命令中的 {username} 换成你自己的,以及替换自己本地版本的tesseract版本号。

1
2
3
4
5
6
7
cd /Users/username/.m2/repository/net/sourceforge/tess4j/tess4j/5.1.0
mkdir darwin
jar uf tess4j-5.1.0.jar darwin/
# 下个命令中的libtesseract.5.dylib的数字5,记得替换成本地版本的大版本号;比如本地版本为4.5.4,那就替换成libtesseract.4.dylib
cp /usr/local/Cellar/tesseract/5.1.0/lib/libtesseract.5.dylib darwin/libtesseract.dylib
jar uf tess4j-5.1.0.jar darwin/libtesseract.dylib
jar tf tess4j-5.1.0.jar

到此为止,Mac的本地环境配置结束。接下来进入项目配置。


项目配置

下载源码包

首先去官网提供的下载地址下载源码,其中包含其源码,JAR 文件和 DLL 文件等。

创建项目并添加配置

在创建完Java项目后,将上图中的 dist 文件夹和 lib 文件夹中的所有jar文件加入项目。

并将 tessdata文件夹放到项目根目录下。任何有关其他语言的traineddata文件都放在该文件夹下。

文件移植后的大致目录结构为下图所示:

添加依赖

在 pom.xml 中添加 dependency

1
2
3
4
5
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>5.1.0</version>
</dependency>

设置Eclipse

我们需要将dist文件夹下的tess4j.jar导入到Eclipse中。

首先我们右键我们的项目,选择Build Path->Configure Build Path。

然后在Classpath中选择Add External JARs,将tess4j.jar导入到项目中。

关于更详细的将外部jar导入Eclipse可以查看这篇文章

关于其他IDE的设置可以查阅官方给出的文档

代码展示

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
import java.io.File;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

public class OCRHelper {

public static String ocrHelper(String filePath) throws TesseractException {

System.out.println("OCR Starting ...");

ITesseract instance = new Tesseract();

// Set language
instance.setDatapath("your path of tessdata folder");
instance.setLanguage("eng");

// Select your file path
File img = new File(filePath);

// Output result
String result = instance.doOCR(img);
System.out.println("result: " + result);

return result;
}

}

上段代码只是最基础的调用。这篇文章记录了更多的使用情况。

这里给出一个比较复杂的图片验证其功能性。

最终的输出为

1
2
3
4
5
6
7
8
9
10
f.‘"" ‘ ~rT1-r-—l, T.
ElelL —
,, 7 ‘1',
vs 6: it ~ .
a; -* ““‘ rm:-
f.— ( ‘ —
43; vIn
SEMI FINALl! - NaVi vs 62 -
HIGHLIGHTS - IEM Katowice I CSGO
MaltCSGOChanne‘

可见图片上的一些特殊字体和logo会比较影响Tess4J的运行,但是对于正常的文字是可以准确识别出来的(比如上图下方的视频名字)。


本人在设置环境中踩的一些坑

最主要的一个

1
Unable to load library 'tesseract': Native library (darwin/libtesseract.dylib) not found in resource path

报这个错误信息是因为本地的 tesseract环境没有设置正确。按照我之前的步骤重新走一遍基本可以解决。

另,这个文章记录了更多的冲突问题。