转 OpenCV编程案例:混合高斯模型CvGaussBGModel 使用案例

下面程序是使用混合高斯建模方法对目前进行检测的程序。运行时,需要传递视频文件的路径参数,或者连接摄像机,否则出错。

selected from:
http://www.opencv.org.cn/index.php/高斯背景建模
http://baike.baidu.com/view/2663975.htm

代码如下:

  1. #include <stdio.h>
  2. #include <cv.h>
  3. #include <cxcore.h>
  4. #include <highgui.h>
  5. #include<cvaux.h>//必须引此头文件
  6. int main( int argc, char** argv )
  7. {

  8. IplImage* pFrame =NULL;
  9. IplImage* pFrImg =NULL;
  10. IplImage* pBkImg =NULL;
  11. CvCapture* pCapture =NULL;
  12. int nFrmNum =0;

  13. cvNamedWindow("video", 1);//创建自动调节大小的窗口
  14. cvNamedWindow("background",1);
  15. cvNamedWindow("foreground",1);
  16. cvMoveWindow("video", 30,0);
  17. cvMoveWindow("background",360, 0);
  18. cvMoveWindow("foreground",690, 0);
  19. if( argc >2 )
  20. {
  21. fprintf(stderr, "Usage: bkgrd[video_file_name]n");
  22. return -1;
  23. }


  24. //打开视频文件
  25. if(argc ==2)
  26. if( !(pCapture =cvCaptureFromFile(argv[1])))
  27. {
  28. fprintf(stderr, "Can not open video file %sn",argv[1]);
  29. return-2;
  30. }
  31. //打开摄像头
  32. if (argc ==1)
  33. if( !(pCapture =cvCaptureFromCAM(0)))
  34. {
  35. fprintf(stderr, "Can not opencamera.n");
  36. return-2;
  37. }

  38. //初始化高斯混合模型参数
  39. CvGaussBGModel*bg_model=NULL;

  40. while(pFrame =cvQueryFrame( pCapture ))
  41. {
  42. nFrmNum++;
  43. if(nFrmNum == 1)
  44. {
  45. pBkImg =cvCreateImage(cvSize(pFrame->width,pFrame->height),IPL_DEPTH_8U,3);
  46. pFrImg =cvCreateImage(cvSize(pFrame->width,pFrame->height),IPL_DEPTH_8U,1);


  47. //高斯背景建模,pFrame可以是多通道图像也可以是单通道图像
  48. //cvCreateGaussianBGModel函数返回值为CvBGStatModel*,
  49. //需要强制转换成CvGaussBGModel*
  50. bg_model =(CvGaussBGModel*)cvCreateGaussianBGModel(pFrame, 0);
  51. }
  52. else
  53. {
  54. //更新高斯模型
  55. cvUpdateBGStatModel(pFrame,(CvBGStatModel *)bg_model );
  56. //pFrImg为前景图像,只能为单通道
  57. //pBkImg为背景图像,可以为单通道或与pFrame通道数相同
  58. cvCopy(bg_model->foreground,pFrImg,0);
  59. cvCopy(bg_model->background,pBkImg,0);
  60. //把图像正过来
  61. pBkImg->origin=1;
  62. pFrImg->origin=1;

  63. cvShowImage("video", pFrame);
  64. cvShowImage("background",pBkImg);
  65. cvShowImage("foreground",pFrImg);
  66. if(cvWaitKey(2) >= 0 )
  67. break;
  68. }

  69. }

  70. //释放高斯模型参数占用内存
  71. cvReleaseBGStatModel((CvBGStatModel**)&bg_model);
  72. cvDestroyWindow("video");
  73. cvDestroyWindow("background");
  74. cvDestroyWindow("foreground");
  75. cvReleaseImage(&pFrImg);
  76. cvReleaseImage(&pBkImg);
  77. cvReleaseCapture(&pCapture);
  78. return 0;
  79. }
复制代码

程序运行情况如下:

2009-8-20 18:28:53 上传下载附件 (28.92KB)


2009-8-20 18:28:53 上传下载附件 (53.36KB)


2009-8-20 18:28:52 上传下载附件 (17.05KB)



窗口截图是有延时,所以,只能供参考。而且,我的机器运行结果是背景和前景图像都是倒立的。所以要对

  1. //把图像正过来
  2. pBkImg->origin=1;
  3. pFrImg->origin=1;
复制代码

做修改。

算法分析:

  高斯混合模型是用于背景提取的方法,OpenCV的cvaux中cvbgfg_gaussmix.cpp文件根据文献Animproved adaptive background mixture model for real-time trackingwithshadow中提供的方法编写了高斯混合模型函数。其中定义了CvGaussBGModel类用于存放高斯混合模型的各个参数。我用OpenCV使用高斯混合模型函数分以下几步:

[转]OpenCV编程案例:混合高斯模型(CvGaussBGModel)使用案例

  1。需要用到icvUpdateGaussianBGModel,icvReleaseGaussianBGModel两个函数,但是源程序中将这两个函数定义为内部函数,需要做一些修改,首先将cvbgfg_gaussmix.cpp中前面两个函数的声明staticvoid CV_CDECL icvReleaseGaussianBGModel( CvGaussBGModel** bg_model);


  static int CV_CDECL icvUpdateGaussianBGModel( IplImage*curr_frame, CvGaussBGModel* bg_model);两行代码注释掉。然后在cvbgfg_gaussmix.cpp中间部分两个函数的定义部分,函数头static int和staticvoid改成CV_IMPL int 和CV_IMPL void。最后在cvaux.h文件中CVAPI(CvBGStatModel*)cvCreateGaussianBGModel( IplImage* first_frame,


  CvGaussBGStatModelParams* parametersCV_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保存了前景图像。

  

爱华网本文地址 » http://www.aihuau.com/a/25101011/66315.html

更多阅读

达人教你下载MV:免费高清的音乐MV去哪里下载?

达人教你下载MV:免费高清的音乐MV去哪里下载?——简介有些朋友喜欢看MV,但是苦于找不到好的网站下载高清免费的MV。看了本经验,相信在小编的讲解下,你们肯定会豁然开朗。相比其他方法(诸如视频网站、论坛等下载),本方法不必努力提升等级获得

bzoj2322-梦想封印xor高斯消元 bzoj大视野

这道题第一眼看上去:跟bzoj2115那道xor高斯消元好像啊。复习了一遍那道题,然后还是不会做==于是各种无节操膜拜题解标程。这里确实是用到了2115的一些思想,那题做法:http://blog.sina.com.cn/s/blog_6e63f59e0101bklw.html那道题求的是x

被遗忘的绝世小岛:马达加斯加_健康新时代

被遗忘的绝世小岛:马达加斯加  马达加斯加?是不是美国梦工厂动画《马达加斯加》描述的非洲岛屿?相信大多数人对于马达加斯加的印象都是停留在此的,但这并不是它的全部。  马达加斯加(Madagascar),全称马达加斯加共和国,为非洲东南部

声明:《转 OpenCV编程案例:混合高斯模型CvGaussBGModel 使用案例》为网友一起追过的分享!如侵犯到您的合法权益请联系我们删除