号码滚动随机抽取器:OpenCV编程案例:混合高斯模型(CvGaussBGModel)使用案例 - OpenC...
来源:百度文库 编辑:中财网 时间:2024/04/28 00:37:13
代码如下:
- #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(0)))
- {
- 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;
- }
窗口截图是有延时,所以,只能供参考。而且,我的机器运行结果是背景和前景图像都是倒立的。所以要对
- //把图像正过来
- pBkImg->origin=1;
- pFrImg->origin=1;
算法分析:
高斯混合模型是用于背景提取的方法,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保存了前景图像。
什么是高斯混合模型?
常用的肤色模型有高斯模型,混合高斯模型和直方图模型。它们具体内容是什么?
混合模型,如何拟合在一起
混合编程的问题
如何进行混合编程?
OPencv 是什么
什么是编程模型?
编程模型是什么
哪里有人员接替模型的案例
高智能方程式赛车模型
高斯函数平滑如何编程
vb与fortran混合编程问题!
VB和MATLAB混合编程的问题
有关LabVIEW与MATLAB的混合编程
高答模型的问题!
A值模型即A-score model 的案例谁有啊?
请问什么是纳税评估模型,有案例吗?
什么是CV
什么是cv
CV是什么?
什么是CV?
CV是什么
高一信息技术教学案例分析
用c语言编程四则混合运算计算器