OpenCV混合高斯模型前景分离
来源:互联网 发布:人物描写 知乎 编辑:程序博客网 时间:2024/05/16 09:21
运动检测的一般方法
目前,运动物体检测的问题主要分为两类,摄像机固定和摄像机运动。对于摄像机运动的运动物体检测问题,比较著名的解决方案是光流法,通过求解偏微分方程求的图像序列的光流场,从而预测摄像机的运动状态。对于摄像机固定的情形,当然也可以用光流法,但是由于光流法的复杂性,往往难以实时的计算,所以我采用高斯背景模型。因为,在摄像机固定的情况下,背景的变化是缓慢的,而且大都是光照,风等等的影响,通过对背景建模,对一幅给定图像分离前景和背景,一般来说,前景就是运动物体,从而达到运动物体检测的目的单分布高斯背景模型
单分布高斯背景模型认为,对一个背景图像,特定像素亮度的分布满足高斯分布,即对背景图像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。在程序初始化部分定义高斯混合模型参数CvGaussBGModel* bg_model=NULL;在读取第一帧图像(背景图像)时,进行高斯背景建模bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(image, 0);image可以是灰度图象也可以是彩色图像。接下来再读取当前帧时,更新高斯模型
regioncount=icvUpdateGaussianBGModel(currframe, bg_model );regioncount的含义我不确定,我理解是代表背景中不同颜色区域的个数,这个参数我没有用到,它只是icvUpdateGaussianBGModel函数的返回值。
2。现在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); //打开视频文件 pCapture = cvCaptureFromFile("bike.avi"); //pCapture = cvCaptureFromFile("20120726.avi"); if( !pCapture ) { fprintf(stderr, "Can not open video file %s\n", argv[1]); return -2; } //初始化高斯混合模型参数 CvGaussBGModel* bg_model=NULL; while(pFrame = cvQueryFrame( pCapture )) { nFrmNum++; if(nFrmNum == 1) { pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), pFrame->depth, pFrame->nChannels /*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); cvThreshold(pFrImg, pFrImg, 128, 255, CV_THRESH_BINARY_INV); //把图像正过来 // pBkImg->origin=1; // pFrImg->origin=1; cvShowImage("video", pFrame); cvShowImage("background", pBkImg); cvShowImage("foreground", pFrImg); if( cvWaitKey(100) >= 0 ) break; } } //释放高斯模型参数占用内存 cvReleaseBGStatModel((CvBGStatModel**)&bg_model); cvDestroyWindow("video"); cvDestroyWindow("background"); cvDestroyWindow("foreground"); cvReleaseImage(&pFrImg); cvReleaseImage(&pBkImg); cvReleaseCapture(&pCapture); return 0;}
- OpenCV混合高斯模型前景分离
- OpenCV混合高斯模型前景分离
- OpenCv2.4.5实现高斯混合模型的前景分离
- [opencv]目标追踪之前景建模(高斯混合模型)
- 前景背景分离方法(二)高斯混合模型法GMM(Gaussian Mixture Model)
- 高斯混合模型/前景分割算法
- opencv 高斯混合模型提取视频或者图片的前景
- opencv高斯混合模型
- opencv混合高斯模型
- 混合高斯模型 opencv
- opencv之高斯模型分离背景
- OpenCv的混合高斯模型
- OPENCV混合高斯模型原理
- OpenCV 中的GMM模型 高斯混合模型
- 运动检测(前景检测)之(二)混合高斯模型GMM
- 运动检测(前景检测)之(二)混合高斯模型GMM
- 运动检测(前景检测)之(二)混合高斯模型GMM
- 运动检测(前景检测)之(二)混合高斯模型GMM
- C#调用外部DLL
- webkit webApp 开发技术要点总结
- php框架开发四(DAO层)
- [转载]ACM培训计划与我推荐的书籍
- Node(13) Process
- OpenCV混合高斯模型前景分离
- OpenGL入门学习(五)
- 获取IE历史记录
- 快速排序List的通用方法
- 黑马程序员_Java学习日记12_IO流1
- js判断变量是否未定义(转)
- 线程安全和性能之间的博弈问题:
- 学习《21天学通Java 6》(四)第3章总结
- VS2010与资源文件的关联