点击蓝字关注我们
前面文章《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的识别,具体代码如下:
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回调函数
再建一个接口回调函数,用于处理识别后返回的数据
public interface TesseratCallBack {
void CallBackOver(String... msg);
}
MainActivity中加入回调函数操作
在MainActivity中加入回调函数的操作,用于接收到识别的文字后我们在TextView中显示出来。
NDK中图片的预处理
新建C++的类ocrpreprocess用于做图片的预处理
加入了一个静态方法dealocrbmp
预处理也很简单,我们直接就是转为灰度图,通过高斯模糊降燥,然后把图片二值化了,这样让识别字体的更方便一些
然后我们在native-lib.cpp中处理截图这里加入调用的这个方法,让其变成二值化的数据显示出来。
VaccaeSurfaceView修改
在VaccaeSurfaceView修改就比较简单了,直接在返回的图片中加入对TesserartOCR的调用即可。
效果图片
到这里我们的简单改造就算结束了,从视频中看识别的效果还可以,因为我用的是默认的字库,如果要好的效果就要自己训练数据了。
上面来说我们是一个简单的识别效果,后面我会找个时间继续更新,在截取后的图片预处里中加入分割和透视变换,目的就是让其不是在非常正的角度下截图也能加大识别的效果,等全部完成后,Demo还是会继续上传上去的。
-END-
Vaccae的往期经典
OpenCV
《OpenCV4Android NDK方式进行Canny边缘检测》
《OpenCV4Android NDK方式TesserartOCR实时进行识别》
《OpenCV4Android NDK级联方式实时进行人脸检测》
《OpenCV4Android NDK背景消除建模(新Demo附源码)》
《OpenCV4Android NDK利用SurfaceVeiw划矩形截屏存放到RecyclerView中》
Android
《Android利用SurfaceView结合科大讯飞修改语音实别UI》
《Android关于语音识别的功能实现分析(一)---结构化思维》
《Android关于语音识别的功能实现分析(二)---语义解析》
《Android中RecyclerView嵌套RecyclerView》
.Net C#
《C#开源跨平台机器学习框架ML.NET----二元分类情绪分析》
《C#开源跨平台机器学习框架ML.NET----结合SqlSugar进行多类分类》
数据库及其它
《SQL Server中With As的介绍与应用(三)--递归的实战应用》
《Oracle利用row_number()over()方式解决插入数据时重复键的问题》
请扫码
给个关注
微卡智享