混合高斯模型去除背景

本文转自 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 test
			params.weight_init = 0.05;
			params.variance_init = 30;
			params.minArea = 15.f;
			params.n_gauss = 5;	//= K =Number of gaussian in mixture
			params.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 frame
			if(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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值