c++中利用opencv读取视频并将视频resize为1080P@30fps并保存完整过程
时间: 2024-12-27 18:31:38 浏览: 15
在C++中,使用OpenCV库读取视频、调整分辨率(resize)以及保存视频的过程通常包括以下几个步骤:
1. **安装和引入OpenCV库**:
首先,你需要安装OpenCV,并将其头文件和库链接到你的项目中。如果你使用的是CMake,可以在CMakeLists.txt中添加OpenCV的find_package()。
2. **打开视频流**:
使用`cv::VideoCapture`类打开视频文件,例如:
```cpp
cv::VideoCapture cap("input_video.mp4");
```
3. **检查是否成功打开**:
确保视频文件存在并且可以被正确打开:
```cpp
if (!cap.isOpened()) {
std::cerr << "Error opening video file" << std::endl;
return -1;
}
```
4. **设置输出视频的尺寸和帧率**:
创建一个新的`cv::Mat`用于存储每一帧,设置分辨率为1080p(1920x1080),帧率为30fps:
```cpp
int frameWidth = 1920;
int frameHeight = 1080;
cap.set(cv::CAP_PROP_FRAME_WIDTH, frameWidth);
cap.set(cv::CAP_PROP_FRAME_HEIGHT, frameHeight);
cap.set(cv::CAP_PROP_FPS, 30);
```
5. **循环读取并处理视频帧**:
使用`while (true)`循环,直到视频结束:
```cpp
cv::Mat frame;
while (cap.read(frame)) { // 如果读取失败返回false,跳出循环
// 对frame进行resize操作
cv::resize(frame, frame, Size(frameWidth, frameHeight));
// ... 进行其他图像处理操作 ...
// 保存每一帧
imwrite("output_video_frame_" + std::to_string(cap.get(CV_CAP_PROP_POS_FRAMES)) + ".jpg", frame);
// 每隔一定帧数保存一个MP4片段(比如每10秒)
if ((cap.get(CV_CAP_PROP_POS_MSEC) / 1000.0) % 10 == 0) {
std::vector<cv::Mat> frames;
frames.push_back(frame);
// 编码视频片段
encodeVideo("output_video_output.mp4", frames, frameWidth, frameHeight, 30);
}
// 等待下一帧(这里是简化的示例,实际应用可能会有更复杂的延迟控制)
cv::waitKey(1);
}
```
6. **编码视频片段**:
可以使用`cv::imencode()`函数将连续的帧打包成一个视频文件,这里省略了具体实现细节,因为这需要第三方库如FFmpeg。
7. **关闭视频流**:
最后别忘了关闭视频捕获器:
```cpp
cap.release();
```
阅读全文