高斯背景建模

#include "StdAfx.h"
#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <cvaux.h>


int main( int argc, char** argv )
{  
 //参数初始化定义
    IplImage* pFrame = NULL;  
    IplImage* pFrImg = NULL;   
    IplImage* pBkImg = NULL; 
IplImage*dst=NULL;
IplImage*lumi=NULL;
    CvCapture* pCapture = NULL;
    IplImage* origin_rgb = NULL ;//定义rgb空间的存储
    IplImage* origin_ycc = NULL ;//定义转换成YCrCb空间的存储
 


CvMemStorage* m_storage;
CvSeq* m_contour;
  
 //定义窗口
 cvNamedWindow("lumi",1);//定义显示窗口的名字,显示原始的视频
    cvMoveWindow("lumi",30,0);//定义显示窗口的位置
    cvNamedWindow("background",1);//显示经过转换格式的视频
 cvMoveWindow("background",360,0);
    cvNamedWindow("foreground",1);//显示经过亮度提取的视频
    cvMoveWindow("foreground",690,0); 
 
 //读取一帧视频文件作为初始化
    pCapture = cvCaptureFromFile("d://测试/xiaoqu.avi") ;
 pFrame = cvQueryFrame(pCapture);
 int i ;
 for (i=0;i<2;i++)
 {
          pFrame = cvQueryFrame(pCapture);
 }
 //RGB转换成亮度
    origin_rgb = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 3 );
    origin_ycc = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 3 );
    lumi = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 1 );
    pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 1 );
    pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 1 );
    dst = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 1 );


   origin_rgb = cvCloneImage(pFrame) ;//或者 cvCopy(pFrame,origin_rgb,NULL) ;
   cvCopy(pFrame,origin_rgb,NULL) ;//复制视频
   cvCvtColor(origin_rgb,origin_ycc,CV_BGR2YCrCb) ; //实现视频格式转换
   cvSplit(origin_ycc,lumi,NULL,NULL,NULL);    //获取亮度分量
 
    //为高斯模型设置初时参数
    CvGaussBGStatModelParams* params = new CvGaussBGStatModelParams;      
    params->win_size = 50; 
    params->n_gauss = 3;
    params->bg_threshold = 0.7;
    params->std_threshold = 3.5;
    params->minArea = 15;
    params->weight_init = 0.333;
    params->variance_init = 30;
 
 CvBGStatModel* bgModel = cvCreateGaussianBGModel(lumi,params);
 
 int key=-1;
    while(key != 'q')
    {
        //获取下一帧视频
        pFrame = cvQueryFrame(pCapture);
  cvCopy(pFrame,origin_rgb,NULL) ;//复制视频
  cvCvtColor(origin_rgb,origin_ycc,CV_BGR2YCrCb) ; //实现视频格式转换
  cvSplit(origin_ycc,lumi,NULL,NULL,NULL);    //获取亮度分量
        if( !pFrame )
            break;
       
        //更新高斯模型
        cvUpdateBGStatModel(lumi,bgModel);
        pFrImg = bgModel->foreground ;//前景图象
        pBkImg = bgModel->background ; //背景图象


cvCopy(pFrImg,dst);
cvSmooth(dst,dst,CV_GAUSSIAN,5);
cvMorphologyEx(dst,dst,0,0,CV_MOP_CLOSE,3);
        cvMorphologyEx(dst,dst,0,0,CV_MOP_OPEN,1);


m_storage = cvCreateMemStorage(0);
m_contour = cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),m_storage);


cvFindContours(dst,m_storage,&m_contour,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));


for(;m_contour!=0;m_contour=m_contour->h_next)
{
CvScalar color=CV_RGB(255,0,0);
// CvScalar color_rect=CV_RGB(255,0,255);


CvRect m_contour_rect=cvBoundingRect(m_contour,1);


if(fabs(cvContourArea(m_contour))>500.0)
{
cvRectangle(pFrame,cvPoint(m_contour_rect.x,m_contour_rect.y),cvPoint((m_contour_rect.x+m_contour_rect.width),(m_contour_rect.y+m_contour_rect.height)),
color,2,8,0);
//cvDrawContours(lumi,m_contour,color,color,-1,CV_FILLED,8,cvPoint(0,0));
}
}
  
  //显示结果
        cvShowImage("lumi",pFrame);
      cvShowImage("background",pBkImg);
      cvShowImage("foreground",pFrImg);
        key = cvWaitKey(10);
    }
 //   cvWaitKey(0) ;//窗口的回调函数,必须要的,不然窗口的显示会不正常
    //释放窗口内存资源
 cvDestroyWindow("lumi");
    cvDestroyWindow("background");
 cvDestroyWindow("foreground");
 //释放图象占用的内存资源
 cvReleaseImage(&origin_ycc); 
 cvReleaseImage(&pBkImg);   
 cvReleaseImage(&pFrImg); 
 cvReleaseCapture(&pCapture); 
 cvReleaseBGStatModel( &bgModel );
 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值