Tesseract 识别图片

  • Post author:
  • Post category:其他


引入包:

	    <dependency>
			<groupId>org.bytedeco.javacpp-presets</groupId>
			<artifactId>tesseract-platform</artifactId>
			<version>4.0.0-rc2-1.4.3</version>
			<!--  <version>3.04.01-1.3</version> -->
		</dependency> 

		<!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j -->
		<dependency>
			<groupId>net.sourceforge.tess4j</groupId>
			<artifactId>tess4j</artifactId>
			<version>4.3.0</version>
			<!-- <version>3.2.1</version> -->
		</dependency> 

代码:


		ITesseract instance = new Tesseract();
//		instance.setOcrEngineMode(TessOcrEngineMode.OEM_TESSERACT_LSTM_COMBINED);
		instance.setDatapath(datapath);
		instance.setLanguage(lanaguage);

		try {
			String result = instance.doOCR(file).replaceAll("“|_", " ").replaceAll("ˇ", " ").replaceAll("\n+", "|")
					.replaceAll(" ", "");

			String[] s1 = result.split("\\|");
			//String payDate = null;// 支付时间
			String tradeNum = null;// 订单单号
			String merNum = null;// 商户单号

			if (result.indexOf(TRADE_NUM_NAME) >= 0) {
				// 微信订单
				for (int i = 0; i < s1.length; i++) {
					String s = s1[i];
					if (s.indexOf(TRADE_NUM_NAME) >= 0) {
						tradeNum = s.substring(TRADE_NUM_NAME.length());
						if (s1[i + 1].indexOf(MER_NUM_NAME) < 0) {
							tradeNum += s1[i + 1];
						}
					} else if (s.indexOf(MER_NUM_NAME) >= 0) {
						merNum = s.substring(TRADE_NUM_NAME.length());
					}

				}
			} else if (result.indexOf(ALI_TRADE_NUM_NAME) >= 0) {
				//支付宝订单
				for (int i = 0; i < s1.length; i++) {
					String s = s1[i];
					if (s.startsWith(ALI_TRADE_NUM_NAME)) {
						tradeNum = s.substring(ALI_TRADE_NUM_NAME.length());
					/*	if (s1[i + 1].indexOf(ALI_MER_NUM_NAME) < 0) {
							
					        java.util.regex.Pattern pattern=java.util.regex.Pattern.compile("[0-9]*");
					        java.util.regex.Matcher match=pattern.matcher(s1[i + 1]);
							if(match.matches()) {
								tradeNum += s1[i + 1];
							}
						}	*/					
					}else if (s.indexOf(ALI_MER_NUM_NAME) >= 0) {
						if(i+1<s1.length) {
							merNum = s1[i+1];
						}
					}

				}
				
				if(merNum == null) {
					merNum = s1[s1.length-1];
				}
			}
			if (tradeNum == null) {
				return null;
			}
			//map.put(PAY_DATE, payDate);
			map.put(TRADE_NUM, tradeNum);
			map.put(MER_NUM, merNum == null ? "" : merNum);
			return map;

		} catch (TesseractException e) {
			e.printStackTrace();
		}
		return null;

环境搭建:

Tess4J是Tesseract的Java JNA wrapper。本文介绍了在CentOS 7 操作系统中使用Tess4J的步骤及注意事项。

Tesseract

Tesseract 是一个著名的开源OCR引擎,支持100多种语言,可以开箱即用。还可以通过训练方式支持更多语言。Tesseract诞生于1984年,来自HP公司,2005年开源。自2006年起,由谷歌接手开发。截止目前,最新的稳定版本是2017年6月1日发布的3.05.01。还有一只比较活跃的基于LSTM(长短期记忆网络,是一种时间递归神经网络)的4.0版本,还在研发中,最新释放的是2018年6月26日的4.0.0-beta.3。Tesseract由C++开发。

站点:

https://github.com/tesseract-ocr/tesseract

Leptonica

Tesseract作为OCR引擎,避免不了使用图像处理。Tesseract使用的图像处理主要由leptonica提供。Leptonica 包含众多图像处理和图像分析相关的功能。

Java JNA Wrapper

JNA 是 Java Native Access的缩写,顾名思义,是一个实现Java调用操作系统Native应用的库。提起Java本地调用,大家自然联想的JNI,但JNI使用过程十分复杂,会让人望而生畏。JNA则采取更加自然的方式,为Java应用提供调用本地应用的支持。

站点:

https://github.com/java-native-access/jna

Tess4J

Tess4J通过Java JNA Wrapper,提供了Java的Tesseract API,同时还提供了Windows 32bit和64bit的Tesseract的DLL以及一些样例图像。通过Tess4J,可以在Windows下非常便利的通过Java使用Tesseract。对于Linux、MAC等其他操作系统,则需要自行构建Tesseract才可以使用Tess4J。

也就是说,原生的Tess4J并不是跨平台的,仅仅是对Windows开箱即用的。

ess4J:4.0.2

Tesseract:4.0.0-beta.1

Leptonica:1.76.0

JDK:1.8 Update 102 64bit

运行环境:CentOS 7 (内核:3.10.0-862.3.3.el7.x86_64)64bit

GCC:4.8.5

Clang:3.4

开发环境:Windows 10 64bit

为何这样选?

这里的坑是,不能根据自己的喜好,使用新版本。我使用过Tesseract 4.0.0-beta.3,但运行JVM会报出Fatal Error最后自行退出,看报出的错误来判断,大概是Tesseract中某些函数签名变化,Tess4J中签名与之不匹配所致。

构建Tesseract

1 修改yum的Repo

可能是我所在的环境网络非常差,yum默认会使用mirror,但绝大部分mirror连接不上,会导致下载过程在大量无效的mirror尝试中进行,非常浪费时间。

因此,我关闭了yum的fast mirror插件(/etc/yum/pluginconf.d),另外修改了CentOS-Base.repo。

2 安装必备包

yum -y update

yum -y install libstdc++ autoconf automake libtool autoconf-archive pkg-config gcc gcc-c++ make libjpeg-devel libpng-devel libtiff-devel zlib-devel

yum group install -y “Development Tools”

注意:autoconf-archive 是官方说明中都没有提到的必备组件。

3 下载源码

Leptonica

http://www.leptonica.com/source/leptonica-1.76.0.tar.gz

Tesseract

https://codeload.github.com/tesseract-ocr/tesseract/tar.gz/4.0.0-beta.1

安装:

cd leptonica-1.76.0

./autobuild

./configure

make -j

make install


tar -zxvf 4.0.0-beta.1.tar.gz

cd tesseract-4.0.0-beta.1/

./autogen.sh

PKG_CONFIG_PATH=/usr/local/lib/pkgconfig LIBLEPT_HEADERSDIR=/usr/local/include ./configure –with-extra-includes=/usr/local/include –with-extra-libraries=/usr/local/lib

LDFLAGS=”-L/usr/local/lib” CFLAGS=”-I/usr/local/include” make -j

make install

ldconfig

确认安装

经过漫长的编译过程,Tesseract已经安装完毕。

执行如下指令:

tesseract -v

获取so库

在/usr/local/lib中,可以找到Tess4J需要的依赖库libtesseract.so。可见libtesseract.so实际指向libtesseract.so.4.0.0。liblept.so是leptonica的库,Tesseract也需要调用。

但这种方式修改了Tess4J公开发布的JAR包,日后升级会有麻烦,因此,不建议这样操作。

2 将linux-x86-64放到Java工程的classpath根目录。这样在运行时,Tess4J就可以找到库了。我的Java工程采用的Gradle构建,因此将这些文件放到了src/main/resources下。

linux-x86-64目录中包含的文件,是从Linux系统中/usr/local/lib拷贝而来,去掉了一些链接文件,具体如下

在Tess4J设置Tesseract数据目录tessdata

Tesseract运行时是需要加载语言的训练数据的,按照约定,这些训练数据需要放在tessdata下。但Tess4J 4.0.2对Windows和Linux两类操作系统目录处理方式是不一致的。

初始化Tesseract的代码,setDatapath就是用来设置tessdata目录的。

或者使用 cp /usr/local/lib* /usr/lib



版权声明:本文为qq_15140841原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。