点击蓝字关注我们
背景消除建模(BSM)以前我们有两篇介绍过,本章主要是目的是我把Android NDK OpenCV的Demo重新建了一个新的,一是把原来那个DEMO中关于TesserartOCR的相关部分都去掉了,二是在这个Demo中加入多个图片的展示,这样可以显示源图与处理后的图片进行对比了,文章最后会上传Demo的代码。
视频效果
话不多说,还是先上干货
视频中可以看到,我们把源图,基于图像分割的GMM和基于机器学习的KNN的背景消除建模效果都显示了出来,其中右上角的是GMM的背景消除建模,左下角的为KNN的背景消除建模。
背景消除建模(BSM)
在opencv中有两种方法可以进行背景消除:
基于机器学习(Knn--K个最近邻)背景消除建模
基于图像分割(GMM,抗干扰图像分割)背景消除建模
代码实现
我们新建了一个AndroidNDKOpenCV的Demo,主要的模块和原来那个差不多,只是去掉了TesserartOCR相关的东西,如果重新搭项目可以参照我以前的《OpenCV4Android中NDK开发(一)--- OpenCV4.1.0环境搭建》。
然后在CPP文件夹下面建了一个bsm的Class
01
bsm.h头文件
bsm.h
头文件中我们建了三个方法,分别是基于图像分割的高斯混合消除MOG和基于机器学习的KNN,不过这两个都没用到,主要是看红框内第三个,把这两个都做了一遍后一起输出。
02
bsm.cpp源文件
定义基本属性
源文件中首先定义了一个开操作,用于我们消除建模后去一下燥,然后分别定义了MOG和KNN两个对应的Mat
bsmMat方法实现
方法中把传入的源图像src首先进行MOG的背景消除,加入到返回的Mat列表中,再进行KNN的背景消除加入到返回的Mat列表中,代码比较简单的。
03
native-lib.cpp源文件
调用方法
Java_dem_vac_androidndkopencv_VaccaeOpenCVJNI_getCameraframebitbmp是我们的JNI方法,前面部分和我们的别的Demo一样,就是看一下红框中的调用和输出方法即可
04
输出的多图像显示
这个Demo主要的介绍还是这块,关于VaccaeSurfaceView.java的文件
核心方法
CreateBitmapRect
我们增加了一个方法CreateBitmapRect,这个方法就是根据返回的图像数和当前的图像在生成要画出来的矩形的大小和坐标位置
//根据总的图片数生成当前的图片矩形
private RectF CreateBitmapRect(int bitmapidx, int totalbitmap, int totalweight, int totalheight) {
int rectleft, rectright, recttop, rectbottom;
int bitmapweight, bitmapheight;
RectF rectF=null;
if (totalbitmap > 1 && bitmapidx <= totalbitmap) {
//求最合适的比例,求平方根
int rowcol=(int) Math.ceil(Math.sqrt(totalbitmap));
//计算矩形的,如果总数和计算的平方根数一样,那只分列,不分行
if (rowcol == totalbitmap) {
bitmapweight=totalweight / rowcol; //宽度
bitmapheight=totalheight; //高度
rectleft=bitmapidx * bitmapweight;//左
recttop=0; //上
rectright=rectleft + bitmapweight; //右
rectbottom=recttop + bitmapheight; //下
} else {
int row=bitmapidx / rowcol; //第几行
int col=bitmapidx % rowcol; //第几列
bitmapweight=totalweight / rowcol; //宽度
bitmapheight=totalheight / rowcol;//高度
rectleft=col * bitmapweight; //左
recttop=row * bitmapheight; //上
rectright=rectleft + bitmapweight; //右
rectbottom=recttop + bitmapheight; //下
}
rectF=new RectF(rectleft, recttop, rectright, rectbottom);
} else {
rectF=new RectF(0, 0, totalweight, totalheight);
}
return rectF;
}
然后在previewCallback的方法上加入调用上面方法
获取矩形画图
根据图片的列表做了一个循环调用图片中要显示的序号和位置,并画出来
程序截图
源码下载地址
https://github.com/Vaccae/AndroidNDKOpenCV.git
-END-
Vaccae的往期经典
OpenCV
《OpenCV4Android NDK方式进行Canny边缘检测》
《OpenCV4Android NDK方式TesserartOCR实时进行识别》
《OpenCV4Android NDK级联方式实时进行人脸检测》
Android
《Android利用SurfaceView结合科大讯飞修改语音实别UI》
《Android关于语音识别的功能实现分析(一)---结构化思维》
《Android关于语音识别的功能实现分析(二)---语义解析》
《Android中RecyclerView嵌套RecyclerView》
.Net C#
数据库及其它
《SQL Server中With As的介绍与应用(三)--递归的实战应用》
《Oracle利用row_number()over()方式解决插入数据时重复键的问题》
请扫码
给个关注
微卡智享