前面文章《Android SurfaceVeiw划矩形截屏存放到RecyclerView中》已经通过手指划矩形把图片存入到RecyclerView中了,以前也加入过TeseractOCR的识别,因为截取的图像不理解 ,所以识别的效果也不好,所以这次利用截图方式再做一个简单的图像预处理来看看识别效果。
代码实现
每次重新搭新框架确实好麻烦,所以我们还在原来的那个DEMO上直接加入OCR的模块。
★ 实现方法 ★
01 | 在原DEMO上加入TesserartOCR |
---|---|
02 | 界面上加入一个TextView用于识别后显示出来 |
03 | NDK中加入C 的类来做为图片的预处理 |
加入TesserartOCR配置
build.gradle中右侧红框的中的目录里原来已经存放了对应的OCR的动态库,这里我们就没再修改,动态库如下图
在dependencies中要加入api 'com.rmtheis:tess-two:8.0.0',这样我们才能使用OCR识别。
OCR相关的类
新建VaccaeTesserat的类
这个类中用AsyncTask来处理OCR的识别,具体代码如下:
代码语言:javascript复制public class VaccaeTesserat extends AsyncTask<Bitmap, String, String> {
private Context mContext;
private TesseratCallBack mCallBack;
public VaccaeTesserat(Context context) {
mContext=context;
mCallBack=(TesseratCallBack)mContext;
}
@Override
protected String doInBackground(Bitmap... bitmaps) {
TessBaseAPI tessAPI=null;
try {
StringBuilder sb=new StringBuilder();
// 核心预设置代码
tessAPI=new TessBaseAPI();
//如果Android的版本大于23,路径取根目录下的tesserart,小于的话是
//在mnt/sdcard下面
String path=Environment.getExternalStorageDirectory().getAbsolutePath() File.separator "tesserart";
tessAPI.setDebug(true);
tessAPI.init(path , "chi_sim");
//第一张为原图不取
if (bitmaps.length > 1) {
for (int i=1; i < bitmaps.length; i ) {
tessAPI.setImage(bitmaps[i])
; // 获取并显示识别结果
sb.append(tessAPI.getUTF8Text());
}
} else {
tessAPI.setImage(bitmaps[0]);
sb.append(tessAPI.getUTF8Text());
}
mCallBack.CallBackOver(sb.toString());
} catch (Exception e) {
Log.e("Tess", e.getMessage());
mCallBack.CallBackOver(e.getMessage());
} finally {
tessAPI.clear();
tessAPI.end();
}
return null;
}
}
TesseratCallBack回调函数
再建一个接口回调函数,用于处理识别后返回的数据
代码语言:javascript复制public interface TesseratCallBack {
void CallBackOver(String... msg);
}
MainActivity中加入回调函数操作
在MainActivity中加入回调函数的操作,用于接收到识别的文字后我们在TextView中显示出来。
NDK中图片的预处理
新建C 的类ocrpreprocess用于做图片的预处理
加入了一个静态方法dealocrbmp
预处理也很简单,我们直接就是转为灰度图,通过高斯模糊降燥,然后把图片二值化了,这样让识别字体的更方便一些
然后我们在native-lib.cpp中处理截图这里加入调用的这个方法,让其变成二值化的数据显示出来。
VaccaeSurfaceView修改
在VaccaeSurfaceView修改就比较简单了,直接在返回的图片中加入对TesserartOCR的调用即可。
效果图片
到这里我们的简单改造就算结束了,从视频中看识别的效果还可以,因为我用的是默认的字库,如果要好的效果就要自己训练数据了。
上面来说我们是一个简单的识别效果,后面我会找个时间继续更新,在截取后的图片预处里中加入分割和透视变换,目的就是让其不是在非常正的角度下截图也能加大识别的效果,等全部完成后,Demo还是会继续上传上去的。