/*
头文件:OurGaussmix2.h
*/
#include "opencv2/core/core.hpp"
#include <list>
#include"cv.h"
using namespace cv;//InputArray 等的定义在cv里面
namespace ourGaussmix
{ class BackgroundSubtractor: public cv::Algorithm
{
public:
virtual ~BackgroundSubtractor();
virtual void operator()(InputArray _image, OutputArray _fgmask, double learningRate);
virtual void getBackgroundImage(OutputArray backgroundImage,OutputArray backgroundImageslow) const;
}; class OurBackgroundSubtractorMOG2 : public BackgroundSubtractor
{
public:
OurBackgroundSubtractorMOG2();
OurBackgroundSubtractorMOG2(int history, float varThreshold, bool bShadowDetection=true);
virtual ~OurBackgroundSubtractorMOG2();
virtual void operator()(InputArray _image, OutputArray _fgmask, double learningRate);
virtual void getBackgroundImage(OutputArray backgroundImage,OutputArray backgroundImageslow) const;
virtual void initialize(Size frameSize, int frameType);
};
} /*
cpp文件
*/
namespace ourGaussmix
{
/****************************
static const 类型的默认参数
*****************************/ struct GaussBGStatModel2Params
{
//存储参数
}; struct GMM
{
float weight;
float variance;
}; /***基类中的虚函数都设为空的***/
BackgroundSubtractor::~BackgroundSubtractor() {}
void BackgroundSubtractor::operator()(InputArray _image, OutputArray _fgmask, double learningRate)
{
}
void BackgroundSubtractor::getBackgroundImage(OutputArray,OutputArray) const
{
} static CV_INLINE bool detectShadowGMM(const float* data, int nchannels, int nmodes,const GMM* gmm, const float* mean,
float Tb, float TB, float tau)
{
/*阴影检测函数内容*/
} /*定义一个结构体用来执行OurBackgroundSubtractorMOG2*/
struct MOG2Invoker
{
/*C++中结构体是一个特殊的类 下面的是构造函数*/
MOG2Invoker(const Mat& _src, Mat& _dst,
GMM* _gmm, float* _mean,
uchar* _modesUsed,
int _nmixtures, float _alphaT,
float _Tb, float _TB, float _Tg,
float _varInit, float _varMin, float _varMax,
float _prune, float _tau, bool _detectShadows,
uchar _shadowVal)
{
/*给结构体的参数赋值*/
} void operator()(const BlockedRange& range) const
{
/*混合高斯模型参数的更新*/
} }; OurBackgroundSubtractorMOG2::OurBackgroundSubtractorMOG2()
{
/*默认构造函数赋值 全部赋予默认值*/
}
OurBackgroundSubtractorMOG2::OurBackgroundSubtractorMOG2(int _history, float _varThreshold, bool _bShadowDetection)
{
/*构造函数赋值 部分自选 其他默认值*/
}
OurBackgroundSubtractorMOG2::~OurBackgroundSubtractorMOG2()
{
} void OurBackgroundSubtractorMOG2::initialize(Size _frameSize, int _frameType)
{
/*初始化函数 分配内存*/
//bgmodel.create( 1, frameSize.height*frameSize.width*nmixtures*(2 + nchannels), CV_32F );
//bgmodelUsedModes.create(frameSize,CV_8U);
//bgmodelUsedModes = Scalar::all(0);
} void OurBackgroundSubtractorMOG2::operator()(InputArray _image, OutputArray _fgmask, double learningRate)
{
/*判断是否初始化并调用initialize*/
//parallel_for(BlockedRange(0, image.rows),
// MOG2Invoker(image, fgmask,
// (GMM*)bgmodel.data,
// (float*)(bgmodel.data + sizeof(GMM)*nmixtures*image.rows*image.cols),
// bgmodelUsedModes.data, nmixtures, (float)learningRate,
// (float)varThreshold,
// backgroundRatio, varThresholdGen,
// fVarInit, fVarMin, fVarMax, float(-learningRate*fCT), fTau,
// bShadowDetection, nShadowDetection));
} void OurBackgroundSubtractorMOG2::getBackgroundImage(OutputArray backgroundImage,OutputArray backgroundImageslow) const
{ } }

这是opencv中混合高斯模型代码的结构梳理 parallel_for的部分没有看懂 整个的结构还是很清晰的 更新部分的代码写在了结构体MOG2Invoker的重载操作符()中,然后在OurBackgroundSubtractorMOG2的重载操作符()中调用MOG2Inovker。为什么这样写不清楚,会效率更高吗?

混合高斯模型:opencv中MOG2的代码结构梳理的更多相关文章

  1. [zz] 混合高斯模型 Gaussian Mixture Model

    聚类(1)——混合高斯模型 Gaussian Mixture Model http://blog.csdn.net/jwh_bupt/article/details/7663885 聚类系列: 聚类( ...

  2. Opencv混合高斯模型前景分离

    #include "stdio.h" #include "string.h" #include "iostream" #include &q ...

  3. OpenCV混合高斯模型函数注释说明

    OpenCV混合高斯模型函数注释说明 一.cvaux.h #define CV_BGFG_MOG_MAX_NGAUSSIANS 500 //高斯背景检测算法的默认参数设置 #define CV_BGF ...

  4. 运动检测(前景检测)之(二)混合高斯模型GMM

    运动检测(前景检测)之(二)混合高斯模型GMM zouxy09@qq.com http://blog.csdn.net/zouxy09 因为监控发展的需求,目前前景检测的研究还是很多的,也出现了很多新 ...

  5. 混合高斯模型(GMM)推导及实现

    作者:桂. 时间:2017-03-20  06:20:54 链接:http://www.cnblogs.com/xingshansi/p/6584555.html 声明:欢迎被转载,不过记得注明出处哦 ...

  6. 记录:EM 算法估计混合高斯模型参数

    当概率模型依赖于无法观测的隐性变量时,使用普通的极大似然估计法无法估计出概率模型中参数.此时需要利用优化的极大似然估计:EM算法. 在这里我只是想要使用这个EM算法估计混合高斯模型中的参数.由于直观原 ...

  7. 机器学习进阶-背景建模-(帧差法与混合高斯模型) 1.cv2.VideoCapture(进行视频读取) 2.cv2.getStructureElement(构造形态学的卷积) 3.cv2.createBackgroundSubtractorMOG2(构造高斯混合模型) 4.cv2.morpholyEx(对图像进行形态学的变化)

    1. cv2.VideoCapture('test.avi') 进行视频读取 参数说明:‘test.avi’ 输入视频的地址2. cv2.getStructureElement(cv2.MORPH_E ...

  8. PRML读书会第九章 Mixture Models and EM(Kmeans,混合高斯模型,Expectation Maximization)

    主讲人 网络上的尼采 (新浪微博: @Nietzsche_复杂网络机器学习) 网络上的尼采(813394698) 9:10:56 今天的主要内容有k-means.混合高斯模型. EM算法.对于k-me ...

  9. 混合高斯模型(Mixtures of Gaussians)和EM算法

    这篇讨论使用期望最大化算法(Expectation-Maximization)来进行密度估计(density estimation). 与k-means一样,给定的训练样本是,我们将隐含类别标签用表示 ...

随机推荐

  1. linq学习

    最全的linq学习文章: http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html

  2. JavaScript数组属性与方法

    Array 对象属性 属性 描述 constructor 返回对创建此对象的数组函数的引用. length 设置或返回数组中元素的数目. prototype 使您有能力向对象添加属性和方法. Arra ...

  3. 在c#中运行js脚本(将js文件生成为.dll文件)

    原文链接:http://www.cnblogs.com/xhan/archive/2010/10/22/1857992.html 前言: 本来在搞一个Google翻译的接口--向Google翻译发送请 ...

  4. Perl 正则表达式

    匹配:m/<regexp>;/ (还可以简写为 /<regexp>;/ ,略去 m)替换:s/<pattern>;/<replacement>;/转化: ...

  5. Linux系统安装LAMP

    说明: 系统版本:Ubuntu14.04-LTS,可以在Ubuntu官网直接下载.Ubuntu其他版本也可安装本方法搭建LAMP环境! 步骤一,安装apache2 1 sudo apt-get ins ...

  6. C#之LinQ数据库

    一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在foreach一个集合的时候, 也要为遍历的集合的元素,指 ...

  7. JS的构造函数

    //构造函数  //使自己的对象多次复制,同时实例根据设置的访问等级可以访问其内部的属性和方法  //当对象被实例化后,构造函数会立即执行它所包含的任何代码  function myObject(ms ...

  8. hash-4.hashtable

    1.先看hashtable的源代码 public synchronized V put(K key, V value) { // Make sure the value is not null if ...

  9. Android 趣味应用—— 短信编辑器

    修改短信数据库,从而生成任意手机号发送的短信. AndroidManifest.xml <?xml version="1.0" encoding="utf-8&qu ...

  10. 4.了解AngularJS模块和依赖注入

    1.模块和依赖注入概述 1.了解模块 AngularJS模块是一种容器,把代码隔离并组织成简洁,整齐,可复用的块. 模块本身不提供直接的功能:包含其他提供功能的对象的实例:控制器,过滤器,服务,动画 ...