Java的开源文字识别Tess4j与Tesseract-OCR

提示:本文中部分内容图片节选自互联网,无意冒犯。如有侵权请私信联系作者即可删除、更改。

原因

由于项目需要,要求项目可以识别简单的图片,客户不想使用付费的大厂接口,于是我在查看资料后决定使用Tesseract-OCR,因为Tesseract-OCR可以在特定场景下训练语言识别提高正确率。但是在配置和使用过程中遇到各式各样的错误,经过一天的探索终于完成了Tesseract-OCR接口的基本使用。
本文在旨在使读者能够掌握Tesseract-OCR并能使用Java代码进行简单的图像文字识别,以项目实战为例展示Tesseract-OCR的使用。以下是项目运行的识别结果(有点不准确,因为这是官网的语言包没有经过训练。所以识别正确率不是太高,语言识别训练可以观看我的下一篇文章,这篇文章主要讲解Tesseract-OCR的配置事项)

Java的开源文字识别Tess4j与Tesseract-OCR_第1张图片


项目搭建过程:

Tesseract-OCR 是一款开源OCR引擎,由Google维护。相比于其他的开源OCR来说Tesseract-OCR 的好处就是可以通过场景训练语言库提高识别效率。Tesseract-OCR 可以集成多种语言进行图像识别、文字提取等操作。
Java使用Tesseract是通过Tess4j作为桥梁进行调用的。所以Java要使用Tesseract进行OCR识别,需要使用Tess4j作为Jar包调用Tesseract-ocr的语言库。

Tesseract-ocr是安装包,Tess4j是Java调用Tesseract进行识别的jar包。如果只是单纯使用Java调用OCR不牵扯语言训练的话本机无需安装Tesseract-ocr.exe。只需要下载搭建Tesseract-ocr的语言包,并在项目中导入Tess4依赖即可运行,当然识别效果不太好。但是本章节主要讲解Tess4j的项目配置。具体使用Tesseract-ocr并进行语言训练的请参考我的本专栏下另一篇文章Tesseract-OCR 配置与语言训练。

下边是Java调用Tess4j 的步骤:

  1. 下载Tesseract语言包,解压到本地目录,并在项目中配置语言包运行测试。
  2. 下载Tess4j的Demo,并使用其中的Jar包对自己的项目进行配置。

注意:一定要使用官方Demo中的jar进行配置,因为自己搭建环境可能导致Jar的版本冲突导致各的错误。本人曾亲身经历各种麻烦。

详细的使用步骤如下:

  1. 进入Tesseract的GitHub官网进行语言包下载
    Java的开源文字识别Tess4j与Tesseract-OCR_第2张图片
    点击图片中的高亮的Download ZIP会下载语言包的压缩文件,将下载好的压缩文件放入磁盘的根目录下,如本例中解压到E盘根目录下:
    Java的开源文字识别Tess4j与Tesseract-OCR_第3张图片

  2. 登录Tess4j官网下载最新的Tess4j Demo(点击前边的Tess4j Demo文字即可跳转目的地。Tess4j网站语言包下载页面:https://sourceforge.net/projects/tess4j/)Java的开源文字识别Tess4j与Tesseract-OCR_第4张图片
    点击Download页面会出现下载等待的提示,等待一会浏览器就会下载,将下载后的文件夹解压缩后文件的目录结构如下:
    Java的开源文字识别Tess4j与Tesseract-OCR_第5张图片
    你需要做的就是新建一个Java项目并将,上图中高亮的dist和lib文件夹中的所有jar文件复制到项目中的lib文件夹中并添加到项目依赖,新建的项目如下:
    Java的开源文字识别Tess4j与Tesseract-OCR_第6张图片

这个项目的页面自己使用Swing做的一个能类似于QQ进行划区域截图,并对提取文字的小工具,工具能在后台运行并通过监听window快捷键进行划区域截图完成文字提取,并将识别得文字自动复制到剪贴板。想要此工具源码和源码解析的小伙伴请参考本专栏的另一篇文章:java工具OCR。工具的运行界面如下:
Java的开源文字识别Tess4j与Tesseract-OCR_第7张图片

  1. 创建测试类Test,代码如下:
public class Test {
    public static void main(String[] args) throws TesseractException {
        ITesseract instance = new Tesseract();
        //指定语言包的位置就是步骤1中解压的语言包路径
        instance.setDatapath("E:\\tessdata");
        // 我们需要指定识别语种+代表使用多语言识别
        instance.setLanguage("eng+chi_sim");
        // 指定识别图片
        File imgDir = new File("d:\\001.jpg");
        String ocrResult = instance.doOCR(imgDir);
        // 输出识别结果
        System.out.println(ocrResult);
    }
}

运行即可。

运行中出现的问题

如果运行中出现如下错误:

Failed loading language ‘eng’ Tesseract couldn’t load any languages!
Exception in thread “main” java.lang.Error: Invalid memory access

是自己的语言包位置没有导入,请检查setDatapath();方法传入的路径是否与自己的语言路径一至。
如运行中出现如下错误:

Unable to load library ‘libtesseract351’: ÕҲ»µ½ָ¶¨

类似于这种得错误是tess4j中得libtesseract3051.dll文件没有被正确加载,这种情况就比较复杂了,这个文件是Java通过JNI调用其他语言得接口,一般在运行项目时Tess4j会将其另存在另一个存储目录由Java调用。出现调用不了得情况有可能是Java项目配置得Jar不对(所以要严格使用官网得jar包),也有可能是libtesseract3051.dll的文件路径不对(文件路径不对可以对源码调试,不过一般不是这种情况)。
Java的开源文字识别Tess4j与Tesseract-OCR_第8张图片
如果使用中还有其他问题欢迎私信我,一起探讨解决。

你可能感兴趣的:(实战小工具,java,开源,开发语言)