由于需要在应用中将原本的身份认证手动提交身份信息改为用户上传身份证照自动提取信息,提升用户体验,第一时间想到阿里云等平台的收费服务及开源技术Tesseract-OCR(Tesseract-OCR提供了全套训练工具,可降低开发成本,需要下载客户端使用),同时提供了tess4j(tess4j是Java对Tesseract-OCR的封装,使Java应用程序可以调用tess4j API使用Tesseract-OCR),这里先体验一下开源技术tess4j。

一、tess4j实现提取图片信息

1、创建一个maven普通Java项目,标记部分为后面添加。

java怎么读取图片上的文字 java写图片提取文字_java怎么读取图片上的文字

2、添加tess4j相关依赖。如果非maven工程需下载源码包,将源码包下的lib文件夹拷贝至项目下,下一步的图片中显示了源码包目录结构

<!--     tess4j相关依赖   -->
        <dependency>
            <groupId>net.sourceforge.tess4j</groupId>
            <artifactId>tess4j</artifactId>
            <version>3.2.1</version>
        </dependency>

3、下载源码包

tess4j源码包:https://sourceforge.net/projects/tess4j/

中文库地址:https://github.com/tesseract-ocr/tessdata/blob/master/chi_sim.traineddata

其他语言包地址:https://github.com/tesseract-ocr/tessdata

3.1、下载tess4j源码包并解压

java怎么读取图片上的文字 java写图片提取文字_tess4j_02

3.2、将tess4j里的文件夹tessdata拷贝至项目根目录,与src同级。

java怎么读取图片上的文字 java写图片提取文字_源码包_03

3.3、tessdata默认只有英文库eng.traineddata,识别中文需要下载中文包并将中文包拷贝至tessdata里eng.traineddata同级目录下。

java怎么读取图片上的文字 java写图片提取文字_java怎么读取图片上的文字_04

4、在项目中创建图片资源目录,存放本地图片供识别使用,这里在根目录创建并存入几张中、英文、数字图片。

java怎么读取图片上的文字 java写图片提取文字_Java_05

5、编写测试类。

import java.io.File;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

/**
 *  tess4j测试类
 */

public class Tess4jDemo {
    public static void main(String []args) throws TesseractException{

                //创建ITesseract接口的实现实例对象
                ITesseract iTesseract = new Tesseract();
                //设置tessdata训练库语言包地址,项目根目录下为默认地址可不设置
//                iTesseract.setDatapath("E:\IDEA\IntelliJ IDEA 2019.1.3\IdeaProjects\Tess4jDemo\tessdata");
                //默认识别英文
                //如果需要识别英文之外的语种,需要指定识别语种,并且需要将对应的语言包放进项目中
//                iTesseract.setLanguage("chi_sim");

                // 指定本地图片
                File img = new File("E:\\IDEA\\IntelliJ IDEA 2019.1.3\\IdeaProjects\\Tess4jDemo\\Tess4jImages\\num.jpg");
                //开始识别时间
                long startTime = System.currentTimeMillis();
                //识别结果
                String ocrResult = iTesseract.doOCR(img);
                // 输出识别结果
                System.out.println("耗时:" + (System.currentTimeMillis() - startTime) + "ms");
                System.out.println("识别结果: \n" + ocrResult );

    }
}

6、运行结果

6.1、数字图片识别

6.1.1

java怎么读取图片上的文字 java写图片提取文字_tess4j_06

java怎么读取图片上的文字 java写图片提取文字_Java_07

6.1.2

java怎么读取图片上的文字 java写图片提取文字_源码包_08

java怎么读取图片上的文字 java写图片提取文字_Tesseract-OCR_09

6.2、英文图片识别。

java怎么读取图片上的文字 java写图片提取文字_Java_10

java怎么读取图片上的文字 java写图片提取文字_java怎么读取图片上的文字_11

6.3、中文图片识别,将代码中设置中文库的代码注释取消

6.3.1

java怎么读取图片上的文字 java写图片提取文字_Java_12

java怎么读取图片上的文字 java写图片提取文字_Java_13

6.3.2

java怎么读取图片上的文字 java写图片提取文字_源码包_14

java怎么读取图片上的文字 java写图片提取文字_java怎么读取图片上的文字_15

 

结果很明显:在简单环境下,印刷体,数字识别最好,中、英文识别差不多效果一般,复杂环境下,识别效果都很差,必须使用官方提供的训练工具对各种场景提升识别能力