采集视频并写入文件

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

int main(int argc, char** argv)
{
	CvCapture* capture1 = cvCreateCameraCapture(0);//初始化从摄像头中获取视频
	cvNamedWindow("video");//创建一个窗口对象

	IplImage *tempImg = cvQueryFrame(capture1);//创建一个临时img
	double fps = 20;
	CvSize size = cvSize((int)cvGetCaptureProperty(capture1, CV_CAP_PROP_FRAME_WIDTH),
		(int)cvGetCaptureProperty(capture1, CV_CAP_PROP_FRAME_HEIGHT));//获取窗口的大小
	//写入文件参数:目标文件,编码格式,帧率,大小
	CvVideoWriter *Writer = cvCreateVideoWriter("D:\\test.avi", CV_FOURCC('M', 'J', 'P', 'G'), fps, size);
	//使用MJPG格式编码
	//IplImage * out = cvCreateImage(size, IPL_DEPTH_8U, 3);//创建一个多通道的图片,传入size保证与窗口的大小一致
	while (1)
	{
		tempImg = cvQueryFrame(capture1);//获得当前帧
		if (!tempImg)//如果读取不到帧,便退出循环
			break;
		//cvCopy(tempImg, out);//将临时帧拷贝到要写入的帧里面。 参数:(源,目标)
		cvWriteFrame(Writer, tempImg);//将读取的帧写入视屏文件
		cvShowImage("video", tempImg);//显示出来当前帧

		char c = cvWaitKey(33);
		if (c == 27)
			break;
		if (c == 97) // 如果按a,则保存下当前帧
			cvSaveImage("D:\\test.jpg", tempImg);
		
	}
	cvReleaseVideoWriter(&Writer);
//	cvReleaseImage(&out);
	cvReleaseCapture(&capture1); 
	cvDestroyWindow("video"); 
}

cvGetCaptureProperty常用参数:

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 - 视频文件中帧的总数

你可能感兴趣的:(采集视频并写入文件)