一起學習opencv (2)一個帶滑動條的視訊播放器
阿新 • • 發佈:2018-12-17
#include"opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include<iostream> #include<fstream> using namespace std; //g 全域性的標識 int g_slider_position = 0;//儲存滑動條的位置 int g_run = 1, g_dontest = 0;//start out in single step mode cv::VideoCapture g_cap;//幀讀數結構,因回撥函式需要訪問,所以設定為全域性 void onTrackbarSlide(int pos, void *)//回撥程式 { g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);//將進度條移動到位置 if (!g_dontest)//觸發滑動條事件,進入單步模式 g_run = 1; g_dontest = 0; } int main() { cv::namedWindow("helloworld", cv::WINDOW_AUTOSIZE); g_cap.open("F:/..."); //確定總幀數及視訊的高和寬 int frames = (int)g_cap.get(cv::CAP_PROP_FRAME_COUNT); int tmpw = (int)g_cap.get(cv::CAP_PROP_FRAME_WIDTH); int tmph = (int)g_cap.get(cv::CAP_PROP_FRAME_HEIGHT); cout << "video have" << frames << "frames of dimensions(" << tmpw << "," << tmph << ")." << endl; //建立滑動條 cv::createTrackbar("position", "helloworld", &g_slider_position, frames, onTrackbarSlide); cv::Mat frame; while (true) { if (g_run != 0)//一幀幀的讀取視訊並顯示 { g_cap >> frame; if (frame.empty())break; int current_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES); g_dontest = 1; cv::setTrackbarPos("position", "helloworld", current_pos); cv::imshow("helloworld", frame); } char c = (char)cv::waitKey(10); if (c == 's')//single step,程式只讀一張圖片 { g_run = 1; cout << "SIngle step,run=" << g_run << endl; } if (c == 'r')//連續視訊模式 { g_run = -1; cout << "Run mode run=" << g_run << endl; } if (c == 27)break;//esc } return 0;
}
執行結果: