首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

OpenCV 視頻播放器實現:帶進度條滑塊控制

     編輯:C++ 入門

功能

  • 讀取視頻文件播放
  • 進度條顯示當前幀位置
  • 拖動進度條跳轉指定幀

核心 API

  • cvCreateFileCapture:開啟視頻
  • cvQueryFrame:獲取下一幀
  • cvGetCaptureProperty:獲取總幂數 CV_CAP_PROP_FRAME_COUNT
  • cvSetCaptureProperty:設定當前幂 CV_CAP_PROP_POS_FRAMES
  • cvCreateTrackbar:建立滑塊回調

完整代碼 (C 介面)

#include "highgui.h"
#include "cv.h"

int g_slider_position = 0;
CvCapture* g_capture = NULL;

void onTrackbarSlide(int pos) {
    cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);
}

int main() {
    g_capture = cvCreateFileCapture("D:\\Opencv\\testData\\video.avi");
    cvNamedWindow("Video", CV_WINDOW_AUTOSIZE);
    
    int frames = (int)cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);
    if (frames != 0) {
        cvCreateTrackbar("Position", "Video", &g_slider_position, frames, onTrackbarSlide);
    }
    
    IplImage* frame;
    while (1) {
        frame = cvQueryFrame(g_capture);
        if (!frame) break;
        cvShowImage("Video", frame);
        if (cvWaitKey(33) == 27) break; // ESC 退出
    }
    
    cvReleaseCapture(&g_capture);
    cvDestroyWindow("Video");
    return 0;
}

關鍵點

  • 全域變數 g_capture 供回調函數存取
  • cvWaitKey(33) 約 30 FPS 播放速度
  • 進度條最大值 = 總幂數 - 1
  • 滑塊回調中直接 cvSetCaptureProperty 跳轉

C++ 介面對應 (OpenCV 2.x/3.x/4.x)

VideoCapture cap("video.avi");
int frames = cap.get(CAP_PROP_FRAME_COUNT);
namedWindow("Video");
createTrackbar("Position", "Video", &pos, frames, [](int p, void*){
    ((VideoCapture*)cvGetCaptureProperty)->set(CAP_PROP_POS_FRAMES, p);
});
Mat frame;
while (cap.read(frame)) {
    imshow("Video", frame);
    if (waitKey(33) == 27) break;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved