c++opencv为视频添加进度条createTrackbar
时间: 2024-02-13 13:02:02 浏览: 129
要为视频添加进度条,除了利用OpenCV中的VideoCapture和VideoWriter类,还可以使用createTrackbar函数创建一个滑动条,方便用户控制当前播放时间。createTrackbar函数可以创建一个滑动条,并将其绑定到一个回调函数上。当滑动条的值发生改变时,回调函数就会被调用,我们可以在回调函数中更新当前播放时间,并将视频跳转到对应的帧。
下面是一个简单的示例代码,用于在视频帧上添加进度条和滑动条:
```c++
#include <opencv2/opencv.hpp>
#include <string>
using namespace cv;
using namespace std;
// 定义全局变量
int currentFrame = 0;
int totalFrames = 0;
int fps = 0;
double currentTime = 0;
bool isPlaying = true;
// 回调函数:更新当前播放时间
void onTrackbarSlide(int pos, void* userdata) {
currentFrame = pos;
currentTime = (double)currentFrame / fps;
}
int main(int argc, char** argv) {
// 打开视频文件
VideoCapture cap("input_video.mp4");
if (!cap.isOpened()) {
cerr << "Error opening video file" << endl;
return -1;
}
// 获取视频信息
totalFrames = cap.get(CAP_PROP_FRAME_COUNT);
fps = cap.get(CAP_PROP_FPS);
// 创建输出视频文件
string outputFilename = "output_video.mp4";
VideoWriter writer(outputFilename, VideoWriter::fourcc('M', 'P', '4', 'V'), fps, Size(cap.get(CAP_PROP_FRAME_WIDTH), cap.get(CAP_PROP_FRAME_HEIGHT)));
// 创建窗口和滑动条
string windowName = "Video player";
namedWindow(windowName);
createTrackbar("Time", windowName, ¤tFrame, totalFrames, onTrackbarSlide);
// 读取视频帧并添加进度条
Mat frame;
while (isPlaying) {
cap.read(frame);
if (frame.empty()) {
isPlaying = false;
break;
}
// 绘制进度条
string timeString = to_string(currentTime);
putText(frame, timeString, Point(50, 50), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 255, 0), 2);
// 更新滑动条位置
setTrackbarPos("Time", windowName, currentFrame);
// 写入视频帧
writer.write(frame);
// 更新当前时间和帧数
currentTime = (double)currentFrame / fps;
currentFrame++;
}
// 释放资源
cap.release();
writer.release();
destroyAllWindows();
return 0;
}
```
这个示例代码中,我们首先创建一个窗口和一个滑动条,并将滑动条的回调函数设置为onTrackbarSlide。在回调函数中,我们更新当前帧数和播放时间。在主循环中,我们读取视频帧并添加进度条,然后更新滑动条的位置和当前时间。最后,我们释放资源并结束程序。注意,在主循环中,我们必须检查视频是否已经播放完毕,并在需要停止播放时退出循环。
阅读全文