混合高斯模型用多个高斯分布的加权平均来平滑地近似任意形状的密度分布函数。
#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中提供了解决方法,不过没有成功啊魂淡!