转载请注明出处:http://blog.youkuaiyun.com/xiaowei_cqu/article/details/7566070
在做火灾检测时尝试了一下用OpenCV中自带的高斯混合背景建模,由于是快速应用,也没推敲太细,日后有机会再研究吧。
如果只是应用,不推敲原理是很简单的。OpenCV自己有一个高斯模型,源代码在安装目录...\opencvsetuppath\src\cvaux的cvbgfg_gaussmix.cpp文件中。
具体算法是根据P. KaewTraKulPong and R. Bowden的论文《An Improved Adaptive Background Mixture Model for Real-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 );
有关高斯背景的原理,日后再补上吧~