一、视频处理方法:
(1)VideoWriter
类概述:
VideoWriter
类提供了一个 C++ API,用于将视频帧写入视频文件或图像序列,这个类在不同的操作系统上使用不同的后端进行视频编码:
- Linux:使用 FFMPEG。
- Windows:使用 FFMPEG、MSWF 或 DSHOW。
- MacOSX:使用 AVFoundation。
(2)
构造函数和初始化:
- 默认构造函数:不执行任何操作,需要手动调用
open
方法初始化。 - 带参数的构造函数:创建
VideoWriter
对象时初始化视频写入器,需要提供输出文件名、编解码器的 FourCC 码、帧率、帧大小和颜色标志。
(3)重要参数说明:
filename
:输出视频文件的名称。fourcc
:用于压缩帧的编解码器的四字符代码。例如,使用VideoWriter::fourcc('P', 'I', 'M', '1')
表示 MPEG-1 编解码器。fps
:创建的视频流的帧率。frameSize
:视频帧的大小。isColor
:如果非零,编码器将期望并编码彩色帧,否则将处理灰度帧。
(4)编解码器和容器提示:
- 某些后端(如 FFMPEG 与 MP4 容器)使用不同的 FourCC 值。在这种情况下,OpenCV 可能会显示一个关于 FourCC 码转换的警告消息。
(5)打开和关闭视频流:
open
方法:根据提供的参数打开视频流。isOpened
:检查视频写入器是否成功初始化。release
:关闭视频写入器,释放资源。
(6)写入帧:
operator <<
:重载的运算符,用于写入下一帧。write
方法:将指定的图像写入视频文件。
(7)设置和获取属性:
set
方法:设置VideoWriter
的属性。get
方法:获取VideoWriter
的属性。
(8)附加说明:
- 某些编解码器可能需要特定的文件扩展名和/或特定的 FourCC 码。
- 为了获得无损压缩视频,需要使用无损编解码器。
- 通过设置
fourcc=-1
,可以在某些后端中弹出系统编解码器选择对话框。 - 使用
apiPreference
参数可以指定要使用的 API 后端。 params
参数允许指定额外的编码器参数。
二、示例代码
#include <opencv2/core/utils/logger.hpp>//隐藏日志
#include <opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
//隐藏日志,不写也可以
utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);
cout << "-----------start to read Video-------------" << endl;
//也可以使用capVideo.open("C:\\Users\\86173\\Desktop\\TI\\cat.mp4");
VideoCapture capVideo("C:\\Users\\86173\\Desktop\\TI\\cat.mp4");
//保存文件初始化,VideoWriter为OpenCV中定义的视频保存类
VideoWriter writer;
int codec = VideoWriter::fourcc('M', 'J', 'P', 'G');//选择编码方式
// 输出的视频地址及名字
string filename = "C:\\Users\\86173\\Desktop\\TI\\cat1.mp4";
cout << "输出的视频地址:" << filename << endl;//地址及名字
//VideoWriter::fourcc;
double fps = capVideo.get(CAP_PROP_FPS);//定义帧率
Size vSize;//保存的视频的尺寸,此处尺寸缩小一半
vSize.width = capVideo.get(CAP_PROP_FRAME_WIDTH) / 2;
vSize.height = capVideo.get(CAP_PROP_FRAME_HEIGHT) / 2;
//打开视频流 CAP_PROP_FOURCC
writer.open(filename, codec, fps, vSize);
Mat frame;
Mat resizeFrame;
Mat grayFrame;
while (1) {
//视频流中读取图像
capVideo >> frame;
if (frame.empty()) {
cout << "Unable to read frame!" << endl;
destroyAllWindows();
return -1;
}
//保存到视频流,由于视频文件尺寸降为1/2,frame尺寸也要减半
resize(frame, resizeFrame, vSize);
writer.write(resizeFrame);
//可以接各种处理
cvtColor(frame, grayFrame, CV_RGB2GRAY);
imshow("frame", frame);//原视频
imshow("resizeFrame", resizeFrame);//尺寸减半视频
imshow("gray", grayFrame);//灰度视频
//显示图片,延时30ms,必须要加waitKey(),否则无法显示图像
//等待键盘相应,按下ESC键退出
if (waitKey(30) == 27) {
destroyAllWindows();
break;
}
}
destroyAllWindows();
return 0;
}
三、运行结果
运行程序保存的视频cat1