参考资料:《学习OpenCV》中文版P30—33 ,参考网站:计算机视觉小菜鸟的专栏 http://blog.csdn.net/carson2005/article/details/6705758
环境 :windows7+ VS2010 +OpenCV2.4.4 .
说明:1、 在win7下从摄像头获取的图像帧,在写入avi视频的时候会出现问题;从视频文件读取视频帧,则能够顺利进行;
2、cvCaptureFromFile的使用方法:OpenCV中cvCaptureFromFile()用于从.avi文件中读取视频,并返回CvCapture结构指针。 用法如下:
CvCapture* capture= 0 ;
if( !(capture= cvCaptureFromFile("avi文件路径")
{
cout<<"Error";
exit(-1);
}
IplImage* pFrame = cvQueryFrame(capture)); // 函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。至于pFrame中存放的图像帧是否是动态更新的,不太清楚,期待大牛指导啊!
对帧进行处理
cvReleaseCapture(&cap);//释放视频流
代码如下:
#include "stdafx.h"
#include"highgui.h"
#include"cv.h"
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
CvCapture* capture = 0;
cvNamedWindow("pic");
//capture = cvCreateCameraCapture(-1); // 从摄像头读取视频,在win7下不能成功,原因因为win7操作系统去除了wfm
capture = cvCaptureFromFile("E:\\ test.avi"); //从文件读取视频
if(!capture)
{
cout<<"Erroer"<<endl;
system("pause");
exit(-1);
}
IplImage* temImg = cvQueryFrame(capture); //temImg 存储捕获的帧 ,根据视频流
double fps = cvGetCaptureProperty( //帧率
capture,
CV_CAP_PROP_FPS
);
CvSize size = cvSize( //视频图像的大小
(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH),
(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT)
);
CvVideoWriter* writer = cvCreateVideoWriter( //创建一个写设备
"E:\\love.avi", //注意,此处的转义字符
CV_FOURCC('X','V','I','D'),
fps,
size
);
IplImage* log_frame = cvCreateImage(
size,
IPL_DEPTH_8U,
3
);
while(( temImg == cvQueryFrame(capture)) != NULL)
{
cvCopy(temImg,log_frame);
cvWriteFrame(writer,log_frame); //逐帧写入
if(!log_frame) break;
cvShowImage("pic",log_frame); //显示视频
char c = cvWaitKey(33);
if(c==27) break; //用户按esc键退出
}
cvReleaseVideoWriter(&writer);
cvReleaseCapture(&capture);
cvDestroyWindow("pic");
system("pause");
return 0;
}