#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*
//转化成单通道图像再处理
//cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);
cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
//中值滤波
cvSmooth(pFrImg, pFrImg,CV_MEDIAN,3,0,0);
bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(pFrame, 0);
}
else
{
//pFrImg为当前帧的灰度图
cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
cvSmooth(pFrImg, pFrImg,CV_MEDIAN,3,0,0);
//高斯滤波先,以平滑图像
// cvSmooth(pFrImg, pFrImg, CV_GAUSSIAN, 3, 0, 0);
//更新高斯模型
cvUpdateBGStatModel(pFrame, (CvBGStatModel *)bg_model );
//pFrImg为前景图像,只能为单通道
//pBkImg为背景图像,可以为单通道或与pFrame通道数相同
cvCopy(bg_model->foreground,pFrImg,0);
cvCopy(bg_model->background,pBkImg,0);
//进行形态学滤波,去掉噪音
cvSmooth(pFrImg, pFrImg,CV_MEDIAN,3,0,0);
cvErode(pFrImg, pFrImg, 0, 1);
cvDilate(pFrImg, pFrImg, 0, 1);
//将背景转化为图像格式,用以显示
//cvConvert(pBkMat, pBkImg);
//把图像正过来
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);
//cvReleaseMat(&pFrameMat);
//cvReleaseMat(&pFrMat);
//cvReleaseMat(&pBkMat);
cvReleaseCapture(&pCapture);
return 0;
}
MarcoPage
- 粉丝: 4410
- 资源: 8836
最新资源
- 15V3A反激式开关电源 设计资料详细 包含原理图 说明书 仿真实验 设计参数(变压器 各种器件参数 都有)bom表 pcb文件 ic UC3842 光耦 TL431 可以制作实物 在功率范围内
- 图书馆预约管理系统说明1
- 数据库课程设计ssm542基于JAVA的图书馆预约占座系统+vue.sql
- C# 制作CIE 1931 色度图 XYZ色彩空间详解
- 交直混合微电网,Matlab Simulink仿真可运行,微电网仿真,功能函数,m文件 可保证能运行再电子资料
- EEMD集合经验模态分解 免费下载直接送 Matlab源代码 可直接替换excel 附赠案例数据直接运行 适合新手小白
- 基于电动汽车充电的微电网谐波抑制策略研究,包括电动汽车充电负 载模型,风电模型,光伏发现系统,储能系统,以及谐波处理模块 风力发电系统仿真
- 2024最新web网盘系统源码一键安装版源码
- 嵌入式系统中12864液晶与按键交互界面设计与实现
- qt-everywhere-src-5.15.0.tar
- Labview多列表框操作库 常用的功能均已封装直接调用即可 方便快捷开发Labview实现列表框操作
- 51单片机应用于电冰箱温控系统的C语言程序设计与实现
- A02:AT89C51单片机实现的简单串口控制LED程序 功能: 通过串口助手发送数据,单片机串口中断接受数据并控制LED亮灭,并由1602显示LED当前状态 代码配有使用说明 1提供代码与
- 数值计算方法.xmind
- 基于TMS320F28335芯片的BUCK双闭环(PI)DSP代码
- 飞秒多脉冲激光烧蚀热力耦合(双温方程+变形几何+固体力学)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈