OpenCV4Android背景建模(MOG、MOG2)
public class Tutorial2Activity extends Activity implements CvCameraViewListener2 {
……
private Mat mRgba;
private Mat mIntermediateMat;
private Mat mGray;
private BackgroundSubtractorMOG2 mog2;
public void onCameraViewStarted(int width, int height) {
mRgba = new Mat(height, width, CvType.CV_8UC4);
mIntermediateMat = new Mat(height, width, CvType.CV_8UC4);
mGray = new Mat(height, width, CvType.CV_8UC1);
mog2 = new BackgroundSubtractorMOG2(); //OpenCV2.x初始化方法
//mog2 = video.createBackgroundSubtractorMOG2();//OpenCV3.x初始化方法 }
需要注意的是OpenCV2.x初始化BackgroundSubtractorMOG2对象是通过new来实现,但是在3.x版本中是通过mog2 = Video.createBackgroundSubtractorMOG2()来实现。
case BUTTON_GETBG:
mRgba = inputFrame.rgba();
bg2.apply(inputFrame.gray(),mIntermediateMat,0.01);//前景保存在mIntermediateMat中
//bg2.getBackgroundImage(mBG); //OpenCV3.x提供获取背景函数
/**
* 因为OpenCV2.4中没有提供BackgroundSubtractorMOG2类getBackgroundImage的API接口,
* 所以通过FindBackground类定义获取背景的方法,FindBackground类的初始化工作和
* BackgroundSubtractorMOG2类一致,必须在Frame循环之外完成,获取背景的方法在帧循环体内。
*/
public class GetBGImage extends BackgroundSubtractorMOG2{
//继承自BackgroundSubtractorMOG2,其构造方法继承父类构造方法
public GetBGImage (int history, float varThreshold, boolean bShadowDetection)
{
super( history, varThreshold, bShadowDetection) ;
return;
}
//FindBackground extends BackgroundSubtractorMOG2 extends BackgroundSubtractor extends Algorithm类
//algorithm类定义了long类型的nativeobj
public long getNativeObjAddr() {
return nativeObj;
} public void FindFeature(Mat mGr, Mat mBG){
FindFeatures(nativeObj, mGr.nativeObj, mBG.nativeObj);
return;
}
public static native void FindFeatures(long nativeObj,long mGr_nativeObj, long mBG_nativeObj);
}
2、编写Java_com_example_Myapplication_GetBGImage.cpp代码:
#include <jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <vector>
#include <android/log.h>
#include <sys/time.h>
#include <opencv2/video/background_segm.hpp>
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "ProjectName", __VA_ARGS__)
using namespace std;
using namespace cv;
//异常处理,可以不要
static void throwJavaException(JNIEnv *env, const std::exception *e, const char *method) {
std::string what = "unknown exception";
jclass je = 0;
if(e) {
std::string exception_type = "std::exception";
if(dynamic_cast<const cv::Exception*>(e)) {
exception_type = "cv::Exception";
je = env->FindClass("org/opencv/core/CvException");
}
what = exception_type + ": " + e->what();
}
if(!je) je = env->FindClass("java/lang/Exception");
env->ThrowNew(je, what.c_str());
LOGE("%s caught %s", method, what.c_str());
(void)method; // avoid "unused" warning
}
//方法主体,一定要以extern "C"{开头
extern "C" {
JNIEXPORT void JNICALL Java_com_example_Myapplication_GetBGImage_FindFeatures(JNIEnv* , jobject ,
jlong self,
jlong addrGray,
jlong addrBG);
//在java native方法中传入的参数主要有三个,分别对应self、addrGray、addrBG,其中self是自定义的GetBGImage类long类型的nativeobj,它可以作为一个指针指向你定义的GetBGImage类对象。
//当对象指针通过jni传入C++后,你可以通过GetBGImage的父类BackgroundSubtractorMOG2的指针指向这个对象,并在通过指针调用C的接口,从而实现对getBackgroundImage方法的调用。
JNIEXPORT void JNICALL Java_com_example_Myapplication _GetBGImage_FindFeatures(JNIEnv* env, jobject ,
jlong self,
jlong addrGray,
jlong addrBG)
{
static const char method_name[] ="FindFeatures->getBackgroundImage()getFrontMaskImage()";
try{
LOGE("%s",method_name);
Mat& mGr = *(Mat*)addrGray;
Mat& mBG = *(Mat*)addrBG;
cv::BackgroundSubtractorMOG2* me = (cv::BackgroundSubtractorMOG2*) self;
me->operator()(mGr, mBG,0.001);
me->getBackgroundImage(mGr);
return;
}catch(const std::exception &e) {
throwJavaException(env, &e, method_name);
} catch (...) {
throwJavaException(env, 0, method_name);
}
return;
}
}
public class Tutorial2Activity extends Activity implements CvCameraViewListener2 {
……
private Mat mRgba;
private Mat mIntermediateMat;
private Mat mGray;
private GetBGImage mog2;
public void onCameraViewStarted(int width, int height) {
mRgba = new Mat(height, width, CvType.CV_8UC4);
mIntermediateMat = new Mat(height, width, CvType.CV_8UC1);
mGray = new Mat(height, width, CvType.CV_8UC1);
//GetBGImage类继承自BackgroundSubtractorMOG2,其构造方法继承父类构造方法
bg2 = new GetBGImage(30,16,false);
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mGray = inputFrame.gray();
bg2.FindFeature(mGray,mIntermediateMat );
OpenCV4Android背景建模(MOG、MOG2)的更多相关文章
- [MOC062066]背景建模资料收集整理
一.相关博客 背景建模相关资料收集,各个链接都已给出. 资料,不可能非常完整,以后不定期更新. -----------------切割线----------------- 这个哥们总结的非常好啊,看完 ...
- OpenCV笔记(6)(harris角点检测、背景建模)
一.Harris角点 如上图所示,红色框AB都是平面,蓝色框CD都是边缘,而绿色框EF就是角点. 平面:框往X或Y抽移动,变化都很小. 边缘:框沿X或Y轴移动,其中一个变化很小,而另外一个变化比较大. ...
- 【背景建模】SOBS
SOBS(self-Organizing through artificial neural networks)是一种基于自组织神经网络的背景差分算法,主要是借鉴神经网络的特性,一个网络输入节点,对应 ...
- 【背景建模】PbModel
PbModel是基于概率模型的背景差分算法,其基本思想是像素点会因光照变化.运动物体经过产生多种颜色值,但是一段时间内,像素点处于静止状态的时间会比处于运动状态的时间长.因而一段时间内,像素点某个颜色 ...
- 【背景建模】VIBE
ViBe是一种像素级的背景建模.前景检测算法,该算法主要不同之处是背景模型的更新策略,随机选择需要替换的像素的样本,随机选择邻域像素进行更新.在无法确定像素变化的模型时,随机的更新策略,在一定程度上可 ...
- 【背景建模】PBAS
Pixel-Based Adaptive Segmenter(PBAS)检测算法,是基于像素的无参数模型,该算法结合了SACON和VIBE两个算法的优势,并在这两个算法的基础上改进而来,SACON和V ...
- OpenCV ——背景建模之CodeBook(2)
1,CodeBook的来源 先考虑平均背景的建模方法.该方法是针对每一个像素,累积若干帧的像素值,然后计算平均值和方差,以此来建立背景模型,相当于模型的每一个像素含有两个特征值,这两个特征值只是单纯的 ...
- OpenCV ——背景建模之CodeBook(1)
1,CodeBook算法流程介绍 CodeBook算法的基本思想是得到每个像素的时间序列模型.这种模型能很好地处理时间起伏,缺点是需要消耗大量的内存.CodeBook算法为当前图像的每一个像素建立一个 ...
- 背景建模或前景检測之PBAS
申明,本文非笔者原创,原文转载自:http://blog.csdn.net/kcust/article/details/9931575 Pixel-Based Adaptive Segmenter(P ...
随机推荐
- ops-web运维平台-create.jsp-mootools下拉框-复选框
create.jsp页面的,body部分 <body onload="Page.init('${pageError}','${pageMessage}',${isSubmit},tru ...
- (转)添加PROPAGATION_REQUIRES_NEW 事务没有产生作用
最近在做事务添加时 发现自己的事务没有新建,上网查到 仅用作收藏. 其二 注意 事务的注解 应该在 内层的事务上面 一.描述 Spring遇到嵌套事务时,当被嵌套的事务被定义为" ...
- Chrome控制台选择器简介
Chrome的控制台是支持用$来获取元素的,这点可能是很多人不知道的.本篇文章将会简单介绍怎样更好的来使用这种快捷方式来获取元素. 判断当前窗口的$是来自谁的 我们知道jQ里面经常使用$来进行元素选择 ...
- c语言中的内存浅析
1.栈(stack):存局部变量.函数,调用函数时会开辟栈区,函数结束时就自动回收,遵循后进先出的原则,从高地址向低地址增长. 2.堆(heap):malloc.realloc.calloc等开辟的内 ...
- jmeter测试教程
http://www.cnblogs.com/TankXiao/p/4045439.html
- Happy 2006 poj2773
Happy 2006 Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9049 Accepted: 3031 Descri ...
- VC维含义的个人理解
有关于VC维可以在很多机器学习的理论中见到,它是一个重要的概念.在读<神经网络原理>的时候对一个实例不是很明白,通过这段时间观看斯坦福的机器学习公开课及相关补充材料,又参考了一些网络上的资 ...
- java中类之间的关系之封装、继承与多态的几个例子
例子1 1.编写一个Java应用程序,该程序包括3个类:Monkey类.People类和测试类.要求: (1)Monkey类中有个public void speak()方法,在speak方法中输出&q ...
- 面向对象编程笔记--static
通过static方法,提供静态的不需要实例化即可访问的方法或属性.所有的调用者可以使用同一个类(不实例化)或对象(只实例化一次),可以应用的场景: 1)各个调用者共享数据,协同工作. 2)对象只可以实 ...
- OOP编程特性综合项目
package SourceFile; //创建动物类(父类). public abstract class CAnimal { public boolean mammal; //是不是哺乳动物 ...