Android集成Tesseract OCR实现图片文字识别

最近项目需要做图片上的文字识别,在网上找了很久,这方面的知识挺多的,但是很杂。将最近学习到的东西整理一下,仅供参考。

1、Tesseract OCR 介绍我就不说了,自行百度,或者访问:https://github.com/tesseract-ocr  在这个下面你需要关心两个项目:

tesseract:开源的识别引擎,里面包含Android的项目

tessdata:字体识别库(chi_sim.traineddata 中文简体,chi_tra.traineddata 中文繁体,eng.traineddata 英文库)

PS:请自行下载
2、目前针对Android部分的jni需要自己配置很多资源文件,所以本文使用的是Tesseract OCR的一个分支(别人项目自己说的,是不是真的我不知道)
下载地址: https://github.com/rmtheis/tess-two     一定要下载
3、下载解压就ok ,在 tess-two里面找到 tess-two 文件夹,记一下及行,后面要用。
可以开始了么?不行!!!
4、 tess-two 是一个ndk项目!(会ndk的大神可以跳过)
加入你的Android Studio(下文简称为AS)里面没有下载NDK那就跟着我一步步来。
打开AS,点击File,选择settings。(快捷键 Ctrl + alt + S)
偷个懒,直接看图片。红色框全部打钩就行。然后OK,等它自己下载完成后点击finish。

Android集成Tesseract OCR实现图片文字识别_第1张图片

这样就在AS里面下载了NDK,是不是很简单。
PS:不要问我NDK怎么开发,我不是来讲这个的。
5、在AS里面新建一个项目。还记得之前 tess-two里面的 tess-two 文件夹么。嗯,将它作为 module导入项目中,添加到项目依赖中,然后编译。

。。。。。。。。。
我去,报错!!!

如果是android-maven的错误。这样子解决
打开添加的tess-two的module,找到build.gradle文件。
在最开始的地方添加

代码:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'org.codehaus.groovy:groovy-backports-compat23:2.3.5'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
    }
}

图片辅助:

Android集成Tesseract OCR实现图片文字识别_第2张图片

编译通过,恭喜,集成成功!!!

这就完了?不对,还有怎么用。

6、在你的项目中要有相关tessdata文件,tessdata的下载自己参考步骤1里面的。

chi_sim.traineddata一般是使用这个。


7、开始使用!!!
先来初始化TessBaseAPI
private void initTessBaseData() {
        TessBaseAPI  mTess = new TessBaseAPI();
        //存放tessdata的文件路径 就是chi_sim.traineddata文件的位置chi_sim.traineddata
        String datapath = Environment.getExternalStorageDirectory() + "/tesseract/";
        //选择语言 chi_sim 简体中文  eng 英文
        String language = "eng";
        File dir = new File(datapath + "tessdata/");
        if (!dir.exists())
            dir.mkdirs();
        mTess.init(datapath, language);
    }


第二步:获取图片,进行识别

public void onClick(View v) {
        //获取自己的图片,这里是自己放在项目里面的。
        Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.testimage);
        //将图片设置到mTess进行识别
        mTess.setImage(bitmap);
        //获取识别的文字(这里会等一段时间,这里的代码是在主线程的,建议将这部分代码放到子线程)
        String result = mTess.getUTF8Text();
        TextView txtView = new TextView(this);
        txtView.setText("结果为:" + result);
        ImageView imageView = new ImageView(this);
        imageView.setImageBitmap(bitmap);
    }

我忘记把view添加到界面,自己自行发挥了。

PS:为了提高图片识别的准确率,一般是会对图片进行灰度处理。这里就不做介绍了,基本功能都是可以实现的。

你可能感兴趣的:(个人)