前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android NDK OpenCV背景消除建模(新Demo附源码)

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

作者头像
Vaccae
发布2019-09-03 18:37:48
7310
发布2019-09-03 18:37:48
举报
文章被收录于专栏:微卡智享微卡智享

背景消除建模(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,这个方法就是根据返回的图像数和当前的图像在生成要画出来的矩形的大小和坐标位置

代码语言:javascript
复制
//根据总的图片数生成当前的图片矩形
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-

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档