混合高斯模型

 

   高斯背景模型
  运动检测的一般方法
  目前,运动物体检测的问题主要分为两类,摄像机固定和摄像机运动。对于摄像机运动的运动物体检测问题,比较著名的解决方案是光流法,通过求解偏微分方程求的图像序列的光流场,从而预测摄像机的运动状态。对于摄像机固定的情形,当然也可以用光流法,但是由于光流法的复杂性,往往难以实时的计算,所以我采用高斯背景模型。因为,在摄像机固定的情况下,背景的变化是缓慢的,而且大都是光照,风等等的影响,通过对背景建模,对一幅给定图像分离前景和背景,一般来说,前景就是运动物体,从而达到运动物体检测的目的。
  单分布高斯背景模型
  单分布高斯背景模型认为,对一个背景图像,特定像素亮度的分布满足高斯分布,即对背景图像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里这个函数的使用,把一些初步的心得发出来,有问题的地方请大家多指点。
  高斯混合模型是用于背景提取的方法,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 <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;
  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;
  }
本文详细介绍了如何利用Python语言结合MySQL数据库开发一个学生管理系统。通过这一过程,读者不仅能够掌握系统设计的基本思路,还能学习到如何使用Python进行数据库操作。该系统涵盖了用户界面设计、数据验证以及数据库的增删改查等多个关键环节。 Python作为一种高级编程语言,以简洁易懂著称,广泛应用于数据分析、机器学习和网络爬虫等领域,同时也非常适合用于快速开发数据库管理应用。MySQL是一个广泛使用的开源关系型数据库管理系统,具有轻量级、高性能、高可靠性和良好的编程语言兼容性等特点,是数据存储的理想选择。在本系统中,通过Python的pymysql库实现了与MySQL数据库的交互。 pymysql是一个Python第三方库,它允许程序通过类似DB-API接口连接MySQL数据库,执行SQL语句并获取结果。在系统中,通过pymysql建立数据库连接,执行SQL语句完成数据的增删改查操作,并对结果进行处理。 系统采用命令行界面供用户操作。程序开始时,提示用户输入学生信息,如学号、姓名和各科成绩,并设计了输入验证逻辑,确保数据符合预期格式,例如学号为1至3位整数,成绩为0至100分的整数。 数据库设计方面,系统使用名为“test”的数据库和“StuSys”表,表中存储学生的学号、姓名、各科成绩及总成绩等信息。通过pymysql的cursor对象执行SQL语句,实现数据的增删改查操作。在构建SQL语句时,采用参数化查询以降低SQL注入风险。 系统在接收用户输入时进行了严格验证,包括正则表达式匹配和数字范围检查等,确保数据的准确性和安全性。同时,提供了错误处理机制,如输入不符合要求时提示用户重新输入,数据库操作出错时给出相应提示。 在数据库操作流程中,用户可以通过命令行添加学生信息或删除记录。添加时会检查学号是否重复以避免数据冲突,删除时需用户确认。通过上述分析,本文展示了从
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值