⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bkgauss.cpp

📁 本算法基于混合高斯模型编程
💻 CPP
字号:



#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <cvaux.h>//必须引此头文件



// various tracking parameters (in seconds)
const double MHI_DURATION = 0.5;
const double MAX_TIME_DELTA = 0.5;
const double MIN_TIME_DELTA = 0.05;
const int N = 3;




//
const int CONTOUR_MAX_AERA =500;

// ring image buffer
IplImage **buf = 0;
int last = 0;

// temporary images
IplImage *mhi = 0; // MHI: motion history image

CvFilter filter = CV_GAUSSIAN_5x5;
CvConnectedComp *cur_comp, min_comp;
CvConnectedComp comp;
CvMemStorage *storage;
CvPoint pt[4];















int main( int argc, char** argv )
{     
	
	 CvMemStorage *stor;
    CvSeq *cont, *result, *squares;
    CvSeqReader reader;
	
	
	
	
	
	
	
	
	
	
	IplImage* pFrame = NULL;    
	IplImage* pFrImg = NULL;   
	IplImage* pBkImg = NULL;    
	CvCapture* pCapture = NULL;  
    int nFrmNum = 0;    
	cvNamedWindow("video", 1);
    cvNamedWindow("background",1); 
	cvNamedWindow("foreground",1);   
	cvMoveWindow("video", 30, 0);   
	cvMoveWindow("background", 360, 0);  
	cvMoveWindow("foreground", 690, 0); 
	
	
	/*
	if( argc > 2 )     
	{    
		fprintf(stderr, "Usage: bkgrd [video_file_name]\n"); 
		return -1;     
	}     
	//打开视频文件   
	if(argc == 1)      
		if( !(pCapture = cvCaptureFromFile(argv[1])))  
		{         
			fprintf(stderr, "Can not open video file %s\n", argv[1]);   
			return -2;           } 
		//打开摄像头    if (argc == 2)     
		if( !(pCapture = cvCaptureFromCAM(-1)))   
        {          
			fprintf(stderr, "Can not open camera.\n");      
			return -2;        
		}  */               
	pCapture = cvCaptureFromAVI("d:\\tq3S2.avi"); 
		
		
		//初始化高斯混合模型参数 
		CvGaussBGModel* bg_model=NULL;   
		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,1); 
			//高斯背景建模    
			bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(pFrame, 0);  
		}        
		else      {          
			int regioncount=0;        
			//更新高斯模型   
		//	regioncount=icvUpdateGaussianBGModel(pFrame, bg_model ); 
			cvUpdateBGStatModel(pFrame, (CvBGStatModel *)bg_model );



 // 下面的程序段用来找到轮廓
    //
    // Create dynamic structure and sequence.
    stor = cvCreateMemStorage(0);
    cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint) , stor);
    
    // 找到所有轮廓
    cvFindContours( pFrImg, stor, &cont, sizeof(CvContour), 
                    CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

   /* for(;cont;cont = cont->h_next)
    {   
        // Number point must be more than or equal to 6 (for cvFitEllipse_32f).        
        if( cont->total < 6 )  
            continue;

        // Draw current contour.
        cvDrawContours(img,cont,CV_RGB(255,0,0),CV_RGB(255,0,0),0,1, 8, cvPoint(0,0));
    }  // end of for-loop: "cont"
*/
    // 直接使用CONTOUR中的矩形来画轮廓
    for(;cont;cont = cont->h_next)
    {
              CvRect r = ((CvContour*)cont)->rect;
              if(r.height * r.width > CONTOUR_MAX_AERA) // 面积小的方形抛弃掉
              {
                  cvRectangle( pFrame, cvPoint(r.x,r.y), 
                          cvPoint(r.x + r.width, r.y + r.height),
                          CV_RGB(255,0,0), 1, CV_AA,0);
              }
    }
    // free memory
    cvReleaseMemStorage(&stor);
//    cvReleaseImage( &pyr );















			//pFrImg为前景图像   pBkImg为背景图像    
			cvCopy(bg_model->foreground,pFrImg,0);    
			cvCopy(bg_model->background,pBkImg,0);  
			//把图像正过来        
			pBkImg->origin=1;         
			pFrImg->origin=1;        
			cvShowImage("video", pFrame);  
			cvShowImage("background", pBkImg);   
			cvShowImage("foreground", pFrImg);       
			if( cvWaitKey(2) >= 0 )        
				break;          
		}        
		}    
		//释放高斯模型参数占用内存 
		cvReleaseBGStatModel((CvBGStatModel**)&bg_model);
		//icvReleaseGaussianBGModel(&bg_model);   
		cvDestroyWindow("video");   
		cvDestroyWindow("background"); 
		cvDestroyWindow("foreground");   
		cvReleaseImage(&pFrImg);    
		cvReleaseImage(&pBkImg);      
		cvReleaseCapture(&pCapture);    
		return 0;
} 










































































































































































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -