OpenCV播放视频、摄像头捕获与存储

播放avi

cvNamedWindow("aviWindow",CV_WINDOW_AUTOSIZE);
CvCapture* capture=cvCreateFileCapture("d:\1.avi");
IplImage* frame;
while(1)
{
	frame=cvQueryFrame(capture);
	if(!frame)
		break;
	cvShowImage("aviWindow",frame);
	char c=cvWaitKey(33); //相当于设置帧速率
	if(c==27)break; //表示按esc退出
}
cvReleaseCapture(&capture);
cvDestroyWindow("aviWindow");

avi设置

获取avi总帧数
double frameCount=cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);
第二个参数可以是:
CV_CAP_PROP_POS_MSEC - 影片目前位置,为毫秒数或者视频获取时间戳
CV_CAP_PROP_POS_FRAMES - 将被下一步解压/获取的帧索引,以0为起点
CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾)
CV_CAP_PROP_FRAME_WIDTH - 视频流中的帧宽度
CV_CAP_PROP_FRAME_HEIGHT - 视频流中的帧高度
CV_CAP_PROP_FPS - 帧率
CV_CAP_PROP_FOURCC - 表示codec的四个字符
CV_CAP_PROP_FRAME_COUNT - 视频文件中帧的总数


设置播放位置
cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,frameCount/2);
第二个参数可以是:
CV_CAP_PROP_POS_MSEC - 从文件开始的位置,单位为毫秒
CV_CAP_PROP_POS_FRAMES - 单位为帧数的位置(只对视频文件有效)

CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾)
CV_CAP_PROP_FRAME_WIDTH - 视频流的帧宽度(只对摄像头有效)
CV_CAP_PROP_FRAME_HEIGHT - 视频流的帧高度(只对摄像头有效)
CV_CAP_PROP_FPS - 帧率(只对摄像头有效)
CV_CAP_PROP_FOURCC - 表示codec的四个字符(只对摄像头有效)

捕获摄像头

	cvNamedWindow("aviWindow",CV_WINDOW_AUTOSIZE);
	//CvCapture* capture=cvCreateCameraCapture(0);
	CvCapture* capture=cvCaptureFromCAM(0);//代表第一个摄像头,该函数必须在主线程中执行
   if(!capture){exit(0);}
	IplImage* frame;
	while(1)
	{
		frame=cvQueryFrame(capture);
		if(!frame)
			break;
		cvShowImage("aviWindow",frame);
		char c=cvWaitKey(33); //相当于设置帧速率
		if(c==27)break; //表示按esc退出
	}
	cvReleaseCapture(&capture);
	cvDestroyWindow("aviWindow");

保存为avi

程序运行前确保avi文件名不存在,保存文件的路径存在,否则创建writer会失败。
如果要将保存avi和摄像头捕捉显示同时进行,注意避免同时访问frame的冲突。
(int)cvGetCaptureProperty(cap,CV_CAP_PROP_FOURCC)可以获取编码模式

全局变量:
CvVideoWriter *writer=NULL;

保存过程:
int fps     = 12; 
	CvSize  size=cvSize((int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT));
	CTime time=CTime::GetCurrentTime();
	CString str=time.Format("%Y-%m-%d  %H-%M-%S");
	CString file="d:\avi\"+str+".avi";//ANCI时
	writer=cvCreateVideoWriter(file,CV_FOURCC('I', 'Y', 'U', 'V'),fps,size);//此参数传递-1,可以查看和选择已有的编码模式,也可以传入其他数字进行测试。
	while((frame=cvQueryFrame(capture))!=NULL)
	{
		Sleep(fps);
		cvWriteFrame(writer, frame);
	}

析构:
cvReleaseVideoWriter(&writer);

留下评论