混合高斯模型用多个高斯分布的加权平均来平滑地近似任意形状的密度分布函数。
#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv/cvaux.hpp>
using namespace std;
int main()
{
IplImage *pFrame=NULL;
IplImage *pFrImg=NULL;
IplImage *pBkImg=NULL;
CvCapture *pCapture=NULL;
pCapture= cvCreateFileCapture("video.avi");
cvNamedWindow("video",1);
cvNamedWindow("background",1);
cvNamedWindow("foreground",1);
cvMoveWindow("video",30,0);
cvMoveWindow("background",450,0);
cvMoveWindow("foreground",900,0);
CvGaussBGStatModelParams* params = new CvGaussBGStatModelParams;
params->win_size=2;
params->n_gauss=5;
params->bg_threshold=0.7;
params->std_threshold=3.5;
params->minArea=15;
params->weight_init=0.05;
params->variance_init=30;
pFrame=cvQueryFrame(pCapture);
CvBGStatModel * bg_model = cvCreateGaussianBGModel(pFrame ,params);
int nFrmNum=0;
while(pFrame=cvQueryFrame(pCapture))
{
nFrmNum++;
if(nFrmNum==1)
{
pBkImg=cvCreateImage(cvSize(pFrame->width, pFrame->height),IPL_DEPTH_8U,3);
pFrImg=cvCreateImage(cvSize(pFrame->width, pFrame->height),IPL_DEPTH_8U,3);
}
else
{
cvUpdateBGStatModel(pFrame,bg_model);
pFrImg=bg_model->foreground;
pBkImg=bg_model->background;
cvShowImage("video",pFrame);
cvShowImage("background",pBkImg);
cvShowImage("foreground",pFrImg);
}
if(cvWaitKey(22)>=0)
break;
}
cvReleaseBGStatModel(&bg_model);
cvDestroyAllWindows();
cvReleaseImage(&pFrImg);
cvReleaseImage(&pBkImg);
cvReleaseCapture(&pCapture);
return 0;
}
程序运行结果:
可以看到,background无法显示,http://blog.pzxbc.com/?p=176中提供了解决方法,不过没有成功啊魂淡!
