OpenCV有自带的滑动条创建方法。
int currentFrame = 0;//代表当前帧的位置的int值
totalFrames = cap.get(CAP_PROP_FRAME_COUNT);//总帧数
// 创建滑动条
createTrackbar("Progress", "Video Player", ¤tFrame, totalFrames, onTrackbarSlide);
createTrackbar
函数用于创建一个滑动条,它允许用户以交互方式控制某个数值。
-
Progress
:滑动条的名称。 -
Video Player
:滑动条所在的窗口名称。 -
¤tFrame
:指向currentFrame
变量的指针,滑动条的位置将会控制这个变量的值。 -
cap.get(CAP_PROP_FRAME_COUNT)
:滑动条的最大值,即视频的总帧数。滑动条在 0 到totalFrames之间。 -
onTrackbarSlide
:当滑动条的值发生变化时,这个函数将会被调用。(滑动条上显示的数值的单位为帧。)
下面实现onTrackbarSlide函数,pos传入滑动条的位置值。将cap读取位置设置到和pos一致,将currentFrame更新为pos。
void onTrackbarSlide(int pos, void* userdata) {
cap.set(CAP_PROP_POS_FRAMES, pos);
currentFrame = pos;
}
完整代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
VideoCapture cap;
Mat frame;
bool isPlaying = true;
double fps;
int totalFrames;
int currentFrame = 0;
void onTrackbarSlide(int pos, void* userdata) {
cap.set(CAP_PROP_POS_FRAMES, pos);
currentFrame = pos;
}
int main() {
string path = "D://course//DigitalVideoProcess//labs//lab3//video//exp3.avi";
cap.open(path);
if (!cap.isOpened()) {
cout << "Error opening video file" << endl;
return -1;
}
namedWindow("Video Player", WINDOW_NORMAL);
resizeWindow("Video Player", 800, 600); // 设置窗口大小
fps = cap.get(CAP_PROP_FPS);
totalFrames = cap.get(CAP_PROP_FRAME_COUNT);
// 创建滑动条
createTrackbar("Progress", "Video Player", ¤tFrame, totalFrames, onTrackbarSlide);
while (true) {
if (isPlaying) {
cap >> frame;
if (frame.empty()) {
cout << "End of video" << endl;
break;
}
imshow("Video Player", frame);
currentFrame = cap.get(CAP_PROP_POS_FRAMES);
setTrackbarPos("Progress", "Video Player", currentFrame);
int key = waitKey(1000 / fps); // 控制视频播放速度
if (key == ' ') { // 按空格键暂停或播放
isPlaying = !isPlaying;
}
}
else {
Mat pausedFrame = frame.clone();
putText(pausedFrame, "PAUSED", Point(50, 50), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255), 2);
imshow("Video Player", pausedFrame);
int key = waitKey(0);
if (key == ' ') { // 按空格键暂停或播放
isPlaying = !isPlaying;
}
}
}
cap.release();
destroyAllWindows();
return 0;
}