播放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);