opencv中怎么给yuv格式视频加进度条
时间: 2023-05-26 08:07:48 浏览: 119
OpenCV-YUV.rar_impossiblesef_opencv 尺寸_opencv 形状_yuv图片_图片尺寸
首先,需要了解一下YUV格式的视频数据,YUV格式包含三个独立的分量:亮度(Luma)Y,和两个色度(Chroma)分量UV。每个分量都是独立的,并且有自己的采样率(采样率越高,图像质量越好,但是文件大小也越大)。
在OpenCV中,可以使用cv::VideoCapture打开YUV格式的视频文件,如:
```cpp
cv::VideoCapture cap("test.yuv", cv::CAP_FFMPEG);
if (!cap.isOpened()) {
std::cout << "Failed to open video file" << std::endl;
return -1;
}
cv::Mat frame;
while (cap.read(frame)) {
// Process the frame here
}
```
接下来,我们需要在视频中添加进度条。一种简单的方法是,在每一帧上绘制进度条,并将其与原始帧合并。
```cpp
cv::Mat frame_with_progress_bar;
cv::Mat progress_bar(20, frame.cols, CV_8UC3, cv::Scalar(255, 255, 255)); // 创建一个白色图像,作为进度条的背景
// 在进度条上绘制进度
int total_frames = cap.get(cv::CAP_PROP_FRAME_COUNT);
int current_frame = cap.get(cv::CAP_PROP_POS_FRAMES);
int progress_width = (int)((double)frame.cols * ((double)current_frame / (double)total_frames));
cv::rectangle(progress_bar, cv::Rect(0, 0, progress_width, 20), cv::Scalar(0, 0, 255), cv::FILLED); // 绘制进度条的红色部分
// 将进度条与原始帧合并
cv::vconcat(frame, progress_bar, frame_with_progress_bar);
```
最后,将带有进度条的帧保存为视频文件。可以使用cv::VideoWriter将帧写入视频文件中。
```cpp
cv::VideoWriter writer("output.mp4", cv::CAP_FFMPEG, cap.get(cv::CAP_PROP_FPS), cv::Size(frame_with_progress_bar.cols, frame_with_progress_bar.rows));
if (!writer.isOpened()) {
std::cout << "Failed to open output video file" << std::endl;
return -1;
}
writer.write(frame_with_progress_bar); // 写入带有进度条的帧到视频文件中
```
完整的代码示例:
```cpp
#include <opencv2/opencv.hpp>
int main(int argc, char** argv) {
cv::VideoCapture cap("test.yuv", cv::CAP_FFMPEG);
if (!cap.isOpened()) {
std::cout << "Failed to open video file" << std::endl;
return -1;
}
cv::Mat frame;
while (cap.read(frame)) {
cv::Mat frame_with_progress_bar;
cv::Mat progress_bar(20, frame.cols, CV_8UC3, cv::Scalar(255, 255, 255)); // 创建一个白色图像,作为进度条的背景
// 在进度条上绘制进度
int total_frames = cap.get(cv::CAP_PROP_FRAME_COUNT);
int current_frame = cap.get(cv::CAP_PROP_POS_FRAMES);
int progress_width = (int)((double)frame.cols * ((double)current_frame / (double)total_frames));
cv::rectangle(progress_bar, cv::Rect(0, 0, progress_width, 20), cv::Scalar(0, 0, 255), cv::FILLED); // 绘制进度条的红色部分
// 将进度条与原始帧合并
cv::vconcat(frame, progress_bar, frame_with_progress_bar); // 垂直拼接帧和进度条
cv::imshow("frame", frame_with_progress_bar);
cv::waitKey(1);
// 写入带有进度条的帧到视频文件中
cv::VideoWriter writer("output.mp4", cv::CAP_FFMPEG, cap.get(cv::CAP_PROP_FPS), cv::Size(frame_with_progress_bar.cols, frame_with_progress_bar.rows));
if (!writer.isOpened()) {
std::cout << "Failed to open output video file" << std::endl;
return -1;
}
writer.write(frame_with_progress_bar);
}
cap.release();
return 0;
}
```
阅读全文