混合高斯模型去除背景

来源:互联网 发布:比较两个数组的差异 编辑:程序博客网 时间:2024/05/22 13:34

本文转自 http://www.cnblogs.com/mfryf/archive/2012/03/29/2424024.html

基于混合高斯模型去除背景法

高斯模型去除背景法也是背景去除的一种常用的方法,经常会用到视频图像侦测中。这种方法对于动态的视频图像特征侦测比较适合,因为模型中是前景和背景分离开来的。分离前景和背景的基准是判断像素点变化率,会把变化慢的学习为背景,变化快的视为前景。

#include "stdafx.h"#include "cv.h"#include "highgui.h"#include "cxtypes.h"#include "cvaux.h"# include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){    //IplImage* pFirstFrame = NULL;IplImage* pFrame = NULL;IplImage* pFrImg = NULL;IplImage* pBkImg = NULL;IplImage* FirstImg = NULL;static IplImage* pyrImg =NULL;CvCapture* pCapture = NULL;int nFrmNum = 0;int first = 0,next = 0;int thresh = 0;cvNamedWindow("video",0);//cvNamedWindow("background",0);cvNamedWindow("foreground",0);cvResizeWindow("video",400,400);cvResizeWindow("foreground",400,400);//cvCreateTrackbar("thresh","foreground",&thresh,255,NULL);//cvMoveWindow("background",360,0);//cvMoveWindow("foregtound",0,0);if(!(pCapture = cvCaptureFromCAM(1))){printf("Could not initialize camera , please check it !");return -1;}CvGaussBGModel* bg_model = NULL;while(pFrame = cvQueryFrame(pCapture)){nFrmNum++;if(nFrmNum == 1){pBkImg = cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,3);pFrImg = cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1);FirstImg = cvCreateImage(cvGetSize(pFrame),IPL_DEPTH_8U,1);pyrImg = cvCreateImage(cvSize(pFrame->width/2,pFrame->height/2),IPL_DEPTH_8U,1);CvGaussBGStatModelParams params;params.win_size = 2000;             //Learning rate = 1/win_size;params.bg_threshold = 0.7;         //Threshold  sum of weights for background testparams.weight_init = 0.05;params.variance_init = 30;params.minArea = 15.f;params.n_gauss = 5;//= K =Number of gaussian in mixtureparams.std_threshold = 2.5;//cvCopy(pFrame,pFirstFrame,0);bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(pFrame,¶ms);}else{int regioncount = 0;int totalNum = pFrImg->width *pFrImg->height ;cvSmooth(pFrame,pFrame,CV_GAUSSIAN,3,0,0,0);cvUpdateBGStatModel(pFrame,(CvBGStatModel*)bg_model,-0.00001);cvCopy(bg_model->foreground ,pFrImg,0);cvCopy(bg_model->background ,pBkImg,0);//cvShowImage("background",pBkImg);//cvSmooth(pFrImg,pFrImg,CV_GAUSSIAN,3,0,0,0);//cvPyrDown(pFrImg,pyrImg,CV_GAUSSIAN_5x5);//cvPyrUp(pyrImg,pFrImg,CV_GAUSSIAN_5x5);//cvSmooth(pFrImg,pFrImg,CV_GAUSSIAN,3,0,0,0);cvErode(pFrImg,pFrImg,0,1);cvDilate(pFrImg,pFrImg,0,3);//pBkImg->origin = 1;//pFrImg->origin = 1;cvShowImage("video",pFrame);cvShowImage("foreground",pFrImg);//cvReleaseBGStatModel((CvBGStatModel**)&bg_model);//bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(pFrame,0);/*//catch target frameif(nFrmNum>10 &&(double)cvSumImage(pFrImg)>0.3 * totalNum){first = cvSumImage(FirstImg);next = cvSumImage(pFrImg);printf("Next number is :%d /n",next);cvCopy(pFrImg,FirstImg,0);}cvShowImage("foreground",pFrImg);cvCopy(pFrImg,FirstImg,0);*/if(cvWaitKey(2)== 27){break;}}}cvReleaseBGStatModel((CvBGStatModel**)&bg_model);cvDestroyAllWindows();cvReleaseImage(&pFrImg);cvReleaseImage(&FirstImg);cvReleaseImage(&pFrame);cvReleaseImage(&pBkImg);cvReleaseCapture(&pCapture);return 0;}


1 0
原创粉丝点击