1. 程式人生 > >一起學習opencv (2)一個帶滑動條的視訊播放器

一起學習opencv (2)一個帶滑動條的視訊播放器

#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;

}

執行結果: 帶滑動條的視訊播放器