高斯模型的具体介绍

来源:学生作业帮助网 编辑:作业帮 时间:2024/11/16 04:46:34
高斯模型的具体介绍
xYyS*%FZpVlX*q.5H2:jtNjS,!`9as |/.f7U*K9Z"?儺O42e'k?U钶X >)2K7c;c/ws)u9GR̅ԏpyl,*R0I&|QoG%L,])"- W 8Y *`z0[>-O/ $w z.x~[*_ѣ&1%9@r,2NR̒F;IVX)McsV4~Lc} DGlRxEJi[ݭ"ST=*C#4y >s8Jr/1>0M`&+ccx##s]~Op9'[rhBB<.zKLOTXPwJk]u@"{n6"C4x>&!+o }Qt. ZaiO/ZAU]))ehx} ~#xvGSxB$IO`Ώ)cVVӹ~$r *za)*~+"~,"_#dQjK>e^D Р <{rlSOIRL4ZD΀c3rKJ!rƝN=jHg0O=7s^ ,Vϑ5]MGe%j}PrG=BX`I_Ga(w.{-NA,=L@YtEWFw^be\lW^ϓxt4/STV7Atq2’EnrFP#PǁΔRk46ˆzC=>+!wDd'kRTנVdLMBSlT!^jIH[X}}jz } 8J̀ \ﱹ7|Uv䎺 u>ʀ$-`S}Cm(ȾŰ(7oݾ^*n<2C8t9@f7kvOž`C4jh.2mL`(p W@dgj,w5A+Pu1bAݽ=U;A4(/!zLK>{(}n(ÇЊZُ[A'a4# C- p~d}IEZTwŅZ 8g1Qs,թL,)W"yJ{ycV8R*uu(ɾ}|1K_dtga9y V@K07Jflp-@7džj5LUIhb>@s %{(_txeDN@^['H~V=(ȐE/c5;xD+Ͷ{|77n.I`}W-E|,%? %KQ#.aao!Pu%RZ0>ts-[X/CWFşj$;2[(eKCQ?\Ah(!~%S,~a,|;45CNcDec6hl.i6rwfgt|k,|G@`CzУ?:Fz:[ߧ!MȴY~bwݲhFxբ_Տ Mۖ.dqnf;(?mjGϮ˗-gf-CLdi nsGi\D12E;csC|,]i5sj#ZĖ*3ju+3g2WQH=`h%Rb8 j<0Swɝ^{,C/U-`rX$POr, <&vW ֬c [krpc" sdtru&3ڻ]ݸ=x#l,*{Sok.XW5}Z٠wC_5L?,f[ɬ)-xXŐb(,նVZ Y9kհ]OWVW~sj3 \ @

高斯模型的具体介绍
高斯模型的具体介绍

高斯模型的具体介绍
混合高斯模型:
  运动检测的一般方法
  目前,运动物体检测的问题主要分为两类,摄像机固定和摄像机运动.对于摄像机运动的运动物体检测问题,比较著名的解决方案是光流法,通过求解偏微分方程求的图像序列的光流场,从而预测摄像机的运动状态.对于摄像机固定的情形,当然也可以用光流法,但是由于光流法的复杂性,往往难以实时的计算,所以我采用高斯背景模型.因为,在摄像机固定的情况下,背景的变化是缓慢的,而且大都是光照,风等等的影响,通过对背景建模,对一幅给定图像分离前景和背景,一般来说,前景就是运动物体,从而达到运动物体检测的目的.
  单分布高斯背景模型
  单分布高斯背景模型认为,对一个背景图像,特定像素亮度的分布满足高斯分布,即对背景图像B,(x,y)点的亮度满足:   IB(x,y) ~ N(u,d)   这样我们的背景模型的每个象素属性包括两个参数:平均值u 和 方差d.   对于一幅给定的图像G,如果 Exp(-(IG(x,y)-u(x,y))^2/(2*d^2)) > T,认为(x,y)是背景点,反之是前景点.   同时,随着时间的变化,背景图像也会发生缓慢的变化,这时我们要不断更新每个象素点的参数   u(t+1,x,y) = a*u(t,x,y) + (1-a)*I(x,y)   这里,a称为更新参数,表示背景变化的速度,一般情况下,我们不更新d(实验中发现更不更新d,效果变化不大).   高斯混合模型是用于背景提取的方法,OpenCV的cvaux中cvbgfg_gaussmix.cpp文件根据文献An improved adaptive background mixture model for real-time tracking with shadow中提供的方法编写了高斯混合模型函数.其中定义了CvGaussBGModel类用于存放高斯混合模型的各个参数.我用OpenCV使用高斯混合模型函数分以下几步:   1.需要用到icvUpdateGaussianBGModel,icvReleaseGaussianBGModel两个函数,但是源程序中将这两个函数定义为内部函数,需要做一些修改,首先将cvbgfg_gaussmix.cpp中前面两个函数的声明static void CV_CDECL icvReleaseGaussianBGModel( CvGaussBGModel** bg_model );   static int CV_CDECL icvUpdateGaussianBGModel( IplImage* curr_frame, CvGaussBGModel* bg_model );两行代码注释掉.然后在cvbgfg_gaussmix.cpp中间部分两个函数的定义部分,函数头static int和static void改成CV_IMPL int 和CV_IMPL void.最后在cvaux.h文件中CVAPI(CvBGStatModel*) cvCreateGaussianBGModel( IplImage* first_frame,   CvGaussBGStatModelParams* parameters CV_DEFAULT(NULL));这句后面加上以下两句CVAPI(void) icvReleaseGaussianBGModel( CvGaussBGModel** bg_model );   CVAPI(int) icvUpdateGaussianBGModel( IplImage* curr_frame, CvGaussBGModel* bg_model );   程序修改完毕,点rebuild all,全部重新编译.   2.在程序初始化部分定义高斯混合模型参数CvGaussBGModel* bg_model=NULL;在读取第一帧图像(背景图像)时,进行高斯背景建模bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(image, 0);image可以是灰度图象也可以是彩色图像.接下来再读取当前帧时,更新高斯模型   regioncount=icvUpdateGaussianBGModel(currframe, bg_model );regioncount的含义我不确定,我理解是代表背景中不同颜色区域的个数,这个参数我没有用到,它只是icvUpdateGaussianBGModel函数的返回值.   3.现在bg_model已经保存了经过高斯混合模型分类后的结果,bg_model->background保存了背景图像,bg_model->foreground保存了前景图像.   include   #include   #include   #include   #include //必须引此头文件   int main( int argc, char** argv )   {   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 == 2)   if( !(pCapture = cvCaptureFromFile(argv[1])))   {   fprintf(stderr, "Can not open video file %s\n", argv[1]);   return -2;   }   //打开摄像头   if (argc == 1)   if( !(pCapture = cvCaptureFromCAM(-1)))   {   fprintf(stderr, "Can not open camera.\n");   return -2;   }   //初始化高斯混合模型参数   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);   //高斯背景建模,pFrame可以是多通道图像也可以是单通道图像   //cvCreateGaussianBGModel函数返回值为CvBGStatModel*,   //需要强制转换成CvGaussBGModel*   bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(pFrame, 0);   }   else   {   //更新高斯模型   cvUpdateBGStatModel(pFrame, (CvBGStatModel *)bg_model );   //pFrImg为前景图像,只能为单通道   //pBkImg为背景图像,可以为单通道或与pFrame通道数相同   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);   cvDestroyWindow("video");   cvDestroyWindow("background");   cvDestroyWindow("foreground");   cvReleaseImage(&pFrImg);   cvReleaseImage(&pBkImg);   cvReleaseCapture(&pCapture);   return 0;   }