// 读视频文件和运动物体检测.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
int main(int argc, char* argv[])
{
IplImage* pFrame=NULL;
IplImage* pFrImg=NULL;
IplImage* pBkImg=NULL;
CvMat* pFrameMat=NULL;
CvMat* pFrMat=NULL;
CvMat* pBkMat=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=cvCaptureFromCAM(-1)))
{
fprintf(stderr,"Can not open camera.\n");
return -2;
}
//打开视频文件
if(argc==2)
if(!(pCapture=cvCaptureFromFile(argv[1])))
{
fprintf(stderr,"Can not open video file %s\n",argv[1]);
return -2;
}
//逐帧读取视频
while(pFrame=cvQueryFrame(pCapture))
{
nFrmNum++;
//如果是第一帧,需要申请内存,并初始化
if(nFrmNum==1)
{
pBkImg=cvCreateImage(cvSize(pFrame->width,pFrame->height),IPL_DEPTH_8U,1);
pFrImg=cvCreateImage(cvSize(pFrame->width,pFrame->height),IPL_DEPTH_8U,1);
pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
pFrameMat=cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
//转化成通道图像再处理
cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);
cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
//图像和矩阵之间相互转化
cvConvert(pFrImg, pFrameMat);
cvConvert(pFrImg, pFrMat);
cvConvert(pFrImg, pBkMat);
}
else
{
cvCvtColor(pFrame,pFrImg,CV_BGR2GRAY);
cvConvert(pFrImg,pFrameMat);
//当前帧跟背景图像相减
cvAbsDiff(pFrameMat, pBkMat,pFrMat);
//二值化前景图
cvThreshold(pFrMat, pFrImg,60,255.0,CV_THRESH_BINARY);
//进行形态滤波,去掉噪音
//cvErode(pFrImg,pFrImg,0,1);
//cvDilate(pFrImg,pFrImg,0,1);
//更新背景
cvRunningAvg(pFrameMat,pBkMat,0.003,0);
//将背景转化为图像格式,用以显示
cvConvert(pBkMat,pBkImg);
//显示图像
cvShowImage("video",pFrame);
cvShowImage("background",pBkImg);
cvShowImage("foreground",pFrImg);
//如果有按键事件,则跳出循环
//此等待也为cvShowImage函数提供时间完成显示
//等待时间可以根据CPU速度调整
if(cvWaitKey(2)>=0)
break;
}
}
cvDestroyWindow("vid");
cvDestroyWindow("background");
cvDestroyWindow("foreground");
//释放图像和矩阵
cvReleaseImage(&pFrImg);
cvReleaseImage(&pBkImg);
cvReleaseMat(&pFrameMat);
cvReleaseMat(&pFrMat);
cvReleaseMat(&pBkMat);
cvReleaseCapture(&pCapture);
return 0;
}
读视频文件和运动物体检测cvCaptureFromCAM cvQueryFrame
最新推荐文章于 2021-12-07 20:56:49 发布