第八个程序:写入视频文件avi
在许多应用中,通常需要实现录像功能,我们希望将摄像头捕捉到的数据流或者图像文件拼接成的输入流存放到视频流中,便于日后查看
OpenCV提供了VideoWrite对象用于完成以上工作,一旦将其实例化,我们就可以将图像数据写入到VideoWrite对象中,完成写入之后调用VideoWrite的release()方法将对象释放
OpenCV写入文件的格式必须是.avi,否则将无法写入信息
ViedoWrite类的open函数解析:
open(const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1);
- filename:保存文件名
- fourcc:压缩帧的类型(详细类型请自行搜索)
- fps:帧率
- size:视频分辨率
- is_color:0输出灰度图,非0输出彩色图
接下来我将修改读取摄像头程序,将读取到的信息存放到视频中,具体程序如下所示:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
VideoCapture cap;
cap.open(0);
if(!cap.isOpened())
{
cout << "The camera open failed!" << endl;
}
Mat frame;
int fps = 60;
Size size((int)cap.get(CAP_PROP_FRAME_WIDTH),(int)cap.get(CAP_PROP_FRAME_HEIGHT));
VideoWriter writer;
writer.open("Camera.avi",CV_FOURCC('M','J','P','G'),fps,size);
while(1)
{
cap >> frame;
if(frame.empty())
break;
imshow("Camera",frame);
writer << frame;
if(waitKey(10) == 'c') //按下c键,程序退出
break;
}
cap.release();
}
编写程序过程中遇到的问题:
- fps不能设置为cap.get()获取到的帧率,如果是文件的话,应当如此,但是摄像头读取的信息如果设置为该值会导致fps的值为-1,造成录制的文件中没有数据的问题
程序运行之后,将会实时显示摄像头中的内容,按下c键(小写)之后,程序停止,当前目录生成了录像文件Camera.avi