Android NDK OpenCV背景消除建模(新Demo附源码)

点击蓝字关注我们

背景消除建模(BSM)以前我们有两篇介绍过,本章主要是目的是我把Android NDK OpenCV的Demo重新建了一个新的,一是把原来那个DEMO中关于TesserartOCR的相关部分都去掉了,二是在这个Demo中加入多个图片的展示,这样可以显示源图与处理后的图片进行对比了,文章最后会上传Demo的代码。

视频效果

话不多说,还是先上干货

视频中可以看到,我们把源图,基于图像分割的GMM和基于机器学习的KNN的背景消除建模效果都显示了出来,其中右上角的是GMM的背景消除建模,左下角的为KNN的背景消除建模。

背景消除建模(BSM)

在opencv中有两种方法可以进行背景消除:

  1. 基于机器学习(Knn--K个最近邻)背景消除建模

  2. 基于图像分割(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

《C++ OpenCV案例实战---卡号获取

《C++ OpenCV案例实战---卡片截取(附代码)

《C++ OpenCV透视变换---切换手机正面图片》

《C++ OpenCV实战---获取数量

《C++ OpenCV实战---利用颜色分割获取数量》

《OpenCV4Android NDK方式进行Canny边缘检测》

《OpenCV4Android NDK方式TesserartOCR实时进行识别》

《OpenCV4Android NDK级联方式实时进行人脸检测》

OpenCV4Android NDK稠密光流调用

Android

《Android利用SurfaceView结合科大讯飞修改语音实别UI

《Android关于语音识别的功能实现分析(一)---结构化思维》

《Android关于语音识别的功能实现分析(二)---语义解析》

《Android根据类生成签名字符串

《Android碎片化布局fragment的实战应用

《Android中RecyclerView嵌套RecyclerView

《Android里用AsyncTask后的接口回调

.Net C#

《C#自定义特性(Attribute)讲解与实际应用

《C#根据类生成签名字符串(附DEMO下载地址)

《C++创建动态库C#调用》

《C#与三菱PLC(型号FX2N)串口通讯类

数据库及其它

《Oracel存储过程写报表实战》

《Delphi轮播视频和图片程序(用于双屏显示程序)

《SQL随机增加销售数据的脚本编写(附脚本下载地址)

SQL Server中With As的介绍与应用(三)--递归的实战应用

《Oracle通过ODBC连接SQL Server数据库

Oracle利用row_number()over()方式解决插入数据时重复键的问题

 

请扫码

给个关注

微卡智享


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值