视频的保存
OpenCV提供了VideoWrite()类用于实现多张图像保存成视频文件
保存视频文件VideoWrite()类构造函数
VideoWriter::VideoWriter(); //默认构造函数
VideoWriter::VideoWriter(const String & filename,
int fourcc,
double fps,
bool isColor = ture
)
- filename:保存视频的地址和文件名,包含视频格式
- fourcc:压缩帧的4字符编解码器代码
- fps:保存视频的帧率,即视频中每秒图像的张数
- frameSize:视频帧的尺寸
- isColor:保存视频是否为彩色视频
默认构造函数用来创建一个视频流,后续通过open()函数设置保存文件名称、编解码器、帧数等一系列参数
第二种构造方式输入第一个参数为保存视频文件名称,第二个参数是编解码器的代码,如果赋值 ”-1“ 则自动搜索合适的编解码器
第三个参数为保存视频的帧率,第四个参数是设置保存的视频文件尺寸,注意设置时要与图像的尺寸相同
最后一个参数是设置的视频是否是彩色的
该函数可以通过isOpened()函数判断是否创建成功,可以通过grt()查看视频流的各种属性
保存视频时,只需将生成视频的图像通过 "<<" 一帧一帧赋值给视频流,最后使用release()关闭视频流
示例:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat img;
VideoCapture video(0); //使用摄像头
//读取视频
//VideoCapture video;
//video.open("1.mp4");
if (!video.isOpened()) //判断是否调用成功
{
cout << "打开摄像头失败" << endl;
return -1;
}
video >> img; //获取图像
//检测是否成功获取图像
if (img.empty()) //判断读取图像是否成功
{
cout << "没有获取到图像" <<endl;
return -1;
}
bool isColor = (img.type() == CV_8UC3); //判断(相机)视频类型是否为彩色
VideoWriter writer;
int codec = VideoWriter::fourcc('M','J','P','G'); //选择编码格式
double fps = 10.0; //设置视频帧率
string filename = "E:\\CLion\\opencv_xin\\live.avi"; //保存的视频文件名称
writer.open(filename,codec,fps,img.size(),isColor); //创建保存视频的视频流
if (!writer.isOpened()) //判断视频流是否创建成功
{
cout << "打开视频失败" << endl;
return -1;
}
while (1)
{
//检测是否执行完毕
waitKey(50);
if (!video.read(img)) //判断能否继续从摄像头或者视频文件中读出一帧图像
{
cout << "摄像头断开或者视频读取完成" << endl;
return -1;
}
writer.write(img); //将图像写入视频流
imshow("Live",img); //显示图像
char c = waitKey(50);
if (c == 27) //按”Esc“键退出视频保存
{
break;
}
}
return 0;
}