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。
这样就在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'
}
}
图片辅助:
编译通过,恭喜,集成成功!!!这就完了?不对,还有怎么用。
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:为了提高图片识别的准确率,一般是会对图片进行灰度处理。这里就不做介绍了,基本功能都是可以实现的。
本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为: 2021/01/18 07:11