功能
- 讀取視頻文件播放
- 進度條顯示當前幀位置
- 拖動進度條跳轉指定幀
核心 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;
}