推荐答案
// www.javascriptcn.com code example
#include <opencv2/opencv.hpp>
int main() {
// 创建一个VideoCapture对象来读取视频
cv::VideoCapture capture("input.mp4");
if (!capture.isOpened()) {
std::cerr << "Error opening video file" << std::endl;
return -1;
}
// 获取视频的帧率、宽度和高度
double fps = capture.get(cv::CAP_PROP_FPS);
int width = capture.get(cv::CAP_PROP_FRAME_WIDTH);
int height = capture.get(cv::CAP_PROP_FRAME_HEIGHT);
// 创建一个VideoWriter对象来写入视频
cv::VideoWriter writer("output.mp4", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, cv::Size(width, height));
if (!writer.isOpened()) {
std::cerr << "Error creating video writer" << std::endl;
return -1;
}
cv::Mat frame;
while (capture.read(frame)) {
// 对每一帧进行处理(可选)
// cv::cvtColor(frame, frame, cv::COLOR_BGR2GRAY);
// 将处理后的帧写入视频
writer.write(frame);
}
// 释放资源
capture.release();
writer.release();
return 0;
}本题详细解读
1. VideoWriter 类的作用
VideoWriter 类是 OpenCV 中用于将图像帧写入视频文件的工具。它可以将一系列图像帧保存为视频文件,支持多种视频格式和编码器。
2. VideoWriter 的构造函数
VideoWriter 的构造函数通常需要以下参数:
- filename: 输出视频文件的路径。
- fourcc: 视频编码器的四字符代码(例如
cv::VideoWriter::fourcc('M', 'J', 'P', 'G')表示使用 MJPEG 编码器)。 - fps: 视频的帧率(每秒帧数)。
- frameSize: 视频帧的尺寸(宽度和高度)。
3. 使用步骤
- 创建 VideoCapture 对象: 用于读取输入视频文件或摄像头流。
- 获取视频属性: 通过
VideoCapture对象获取视频的帧率、宽度和高度。 - 创建 VideoWriter 对象: 使用获取到的视频属性初始化
VideoWriter对象。 - 逐帧读取和处理: 使用
VideoCapture对象逐帧读取视频,并对每一帧进行处理(可选)。 - 写入视频: 使用
VideoWriter对象将处理后的帧写入输出视频文件。 - 释放资源: 完成视频写入后,释放
VideoCapture和VideoWriter对象。
4. 常见问题
- 编码器支持: 不同的系统可能支持不同的视频编码器,确保使用的编码器在目标系统上可用。
- 帧率匹配: 输出视频的帧率应与输入视频的帧率一致,以避免播放速度异常。
- 帧尺寸匹配: 输出视频的帧尺寸应与输入视频的帧尺寸一致,否则可能导致写入失败或视频损坏。
通过以上步骤,你可以使用 OpenCV 的 VideoWriter 类将图像帧写入视频文件。