读视频文件和运动物体检测cvCaptureFromCAM cvQueryFrame

// 读视频文件和运动物体检测.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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值