【OpenCV】C++实现视频播放器 #2 滑动条控制视频播放

OpenCV有自带的滑动条创建方法。

int currentFrame = 0;//代表当前帧的位置的int值
totalFrames = cap.get(CAP_PROP_FRAME_COUNT);//总帧数

// 创建滑动条
createTrackbar("Progress", "Video Player", &currentFrame, totalFrames, onTrackbarSlide);

createTrackbar 函数用于创建一个滑动条,它允许用户以交互方式控制某个数值。

  • Progress:滑动条的名称。

  • Video Player:滑动条所在的窗口名称。

  • &currentFrame:指向 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", &currentFrame, 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值