【OpenCV】高斯混合背景提取

转载请注明出处:

在做火灾检测时尝试了一下用OpenCV中自带的高斯混合背景建模,由于是快速应用,也没推敲太细,日后有机会再研究吧。

如果只是应用,不推敲原理是很简单的。OpenCV自己有一个高斯模型,源代码在安装目录…\opencvsetuppath\src\cvaux的cvbgfg_gaussmix.cpp文件中。

具体算法是根据P. KaewTraKulPong and R. Bowden的论文《An Improved Adaptive Background Mixture Model forReal-time Tracking with Shadow Detection》实现的

源码看起来很简单,除了构造、析构函数,不过几个函数:

//初始化函数void BackgroundSubtractorMOG::initialize(Size _frameSize, int _frameType); //处理单通道图像static void process8uC1( BackgroundSubtractorMOG& obj, const Mat& image, Mat& fgmask, double learningRate );//处理多通道图像static void process8uC3( BackgroundSubtractorMOG& obj, const Mat& image, Mat& fgmask, double learningRate );//重载构造符(在这里转由 process8uC1 或 process8uC3 处理)void BackgroundSubtractorMOG::operator()(const Mat& image, Mat& fgmask, double learningRate);//释放高斯模型icvReleaseGaussianBGModel( CvGaussBGModel** bg_model );//更新模型icvUpdateGaussianBGModel( IplImage* curr_frame, CvGaussBGModel* bg_model, double learningRate );//建立模型cvCreateGaussianBGModel( IplImage* first_frame, CvGaussBGStatModelParams* parameters );如果我们不关心具体的参数,都是用默认值的话,,很容易就能建立一个高斯背景提取的模型。//用第一帧初始化模型CvBGStatModel* bgModel= cvCreateGaussianBGModel(pInitFrame);//void FireDetector::CheckFireMove2(IplImage *pImgFrame){cvUpdateBGStatModel( pImgFrame, bgModel );// 以左下角为坐标原点bgModel->foreground->origin = bgModel->background->origin = 1;//滤除噪声//cvErode(bgModel->background, bgModel->background);//cvErode(bgModel->foreground, bgModel->foreground);cvMorphologyEx( pImgMotion, pImgMotion, 0, 0, CV_MOP_CLOSE, 3);cvMorphologyEx( pImgMotion, pImgMotion, 0, 0, CV_MOP_OPEN, 1 );}如果再简化就是cvUpdateBGStatModel( pImgFrame, bgModel );一句话,用新的帧更新背景。

有关高斯背景的原理,日后再补上吧~

用最少的悔恨面对过去

【OpenCV】高斯混合背景提取

相关文章:

你感兴趣的文章:

标签云: