混合高斯模型GMM
混合高斯模型GMM我总结的有两种实现方法,一种是直接使用OPENCV中的MOG函数实现前景检测;另外一种是自己根据GMM的原理编写程序。两种方法对比,方法一比方法二简单,速度快。但是方法二后期可改动的空间大,可以结合其他算法。以下贴出两种方法的实现代码,我是在opencv2.4.10+vs2010中实验通过的。
方法一:
-
-
-
-
- #include <iostream>
- #include <string>
-
- #include <opencv2/opencv.hpp>
-
-
- int main(int argc, char** argv)
- {
- std::string videoFile = "../test.avi";
-
- cv::VideoCapture capture;
- capture.open(videoFile);
-
- if (!capture.isOpened())
- {
- std::cout<<"read video failure"<<std::endl;
- return -1;
- }
-
-
- cv::BackgroundSubtractorMOG2 mog;
-
- cv::Mat foreground;
- cv::Mat background;
-
- cv::Mat frame;
- long frameNo = 0;
- while (capture.read(frame))
- {
- ++frameNo;
-
- std::cout<<frameNo<<std::endl;
-
-
- mog(frame, foreground, 0.001);
-
-
- cv::erode(foreground, foreground, cv::Mat());
-
-
- cv::dilate(foreground, foreground, cv::Mat());
-
- mog.getBackgroundImage(background);
-
- cv::imshow("video", foreground);
- cv::imshow("background", background);
-
-
- if (cv::waitKey(25) > 0)
- {
- break;
- }
- }
-
-
-
- return 0;
- }
实验结果:
当前帧图像
当前背景图像
前景图像
经过腐蚀和膨胀处理后的前景图像
(白色为运动目标区域;灰色为阴影区域;黑色为背景)
< 转载请注明:http://blog.csdn.net/icvpr>
方法二:
MOG_BGS.h
- #pragma once
- #include <iostream>
- #include "opencv2/opencv.hpp"
-
- using namespace cv;
- using namespace std;
-
-
- #define GMM_MAX_COMPONT 6 //每个GMM最多的高斯模型个数
- #define GMM_LEARN_ALPHA 0.005
- #define GMM_THRESHOD_SUMW 0.7
- #define TRAIN_FRAMES 60 // 对前 TRAIN_FRAMES 帧建模
-
- class MOG_BGS
- {
- public:
- MOG_BGS(void);
- ~MOG_BGS(void);
-
- void init(const Mat _image);
- void processFirstFrame(const Mat _image);
- void trainGMM(const Mat _image);
- void getFitNum(const Mat _image);
- void testGMM(const Mat _image);
- Mat getMask(void){
return m_mask;};
-
- private:
- Mat m_weight[GMM_MAX_COMPONT];
- Mat m_mean[GMM_MAX_COMPONT];
- Mat m_sigma[GMM_MAX_COMPONT];
-
- Mat m_mask;
- Mat m_fit_num;
- };
MOG_BGS.cpp
- #include "MOG_BGS.h"
-
- MOG_BGS::MOG_BGS(void)
- {
-
- }
-
- MOG_BGS::~MOG_BGS(void)
- {
-
- }
-
-
- void MOG_BGS::init(const Mat _image)
- {
-
- for(int i = 0; i < GMM_MAX_COMPONT; i++)
- {
- m_weight[i] = Mat::zeros(_image.size(), CV_32FC1);
- m_mean[i] = Mat::zeros(_image.size(), CV_8UC1);
- m_sigma[i] = Mat::zeros(_image.size(), CV_32FC1);
- }
- m_mask = Mat::zeros(_image.size(),CV_8UC1);
- m_fit_num = Mat::ones(_image.size(),CV_8UC1);
- }
-
-
-
-
-
- void MOG_BGS::processFirstFrame(const