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

/ Android / 没有评论 / 2400浏览

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

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

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

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。 img 这样就在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'
    }
}

图片辅助: 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:为了提高图片识别的准确率,一般是会对图片进行灰度处理。这里就不做介绍了,基本功能都是可以实现的。