第四天:鼠標截圖+滑動條播放視頻實例

一、主要功能

(1)、鼠標左鍵按下拖動顯示軌跡,鼠標左鍵彈起顯示截圖並保存截圖到本地。

(2)、視頻播放時,滑動條同時顯示播放幀的位置和視頻幀率,滑動條拖動時可以實現同步指定幀播放。

#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;
Mat img = imread("1.jpg");
Mat temp = img.clone();
Mat ROI;
Point pt;
bool flag = false;

double Fps;

///鼠標消息回調函數
//void OnMouse(int event, int x, int y, int flag, void* param)
//{
//	switch(event)
//	{
//		case CV_EVENT_LBUTTONDOWN:  //鼠標左鍵按下
//			//cout<<"left button down"<<endl;
//			flag = true;
//			pt.x = x;
//			pt.y = y;
//			break;
//		case CV_EVENT_MOUSEMOVE:   //鼠標移動
//			//cout<<"mouse move"<<endl;
//			if(flag)
//			{
//				temp.copyTo(img);
//				rectangle(img, pt, Point(x, y), Scalar(0, 255, 0), 2, 8);
//			}
//			break;
//		case CV_EVENT_LBUTTONUP:   //鼠標左鍵彈起
//			//cout<<"left button up"<<endl;
//			flag = false;
//			ROI = temp(Rect(pt.x, pt.y, x-pt.x, y-pt.y));  //確定ROI區域
//			imshow("ROI", ROI);
//			imwrite("ROI.bmp", ROI);
//			break;
//		default:		
//			break;
//	}
//}
int value;
int framePos; 

void OnChange(int , void* param)
{
	VideoCapture cap = *(VideoCapture*)param;
	cap.set(CV_CAP_PROP_POS_FRAMES, value);  //設置視頻幀位置
}

void main()
{
	///鼠標截圖功能
	//namedWindow("Mouse", CV_WINDOW_AUTOSIZE);
	//setMouseCallback("Mouse", OnMouse, 0);   //設置鼠標回調函數
	//while(1)
	//{
	//	imshow("Mouse", img);
	//	if(27 == waitKey(10))  //Esc跳出循環
	//		break;
	//}
	char strFps[20];
	Mat frame;
	VideoCapture cap("1.avi");
	if(!cap.isOpened())  //打開視頻失敗
		return;

	int FrameCount = cap.get(CV_CAP_PROP_FRAME_COUNT);  //獲取視頻總幀數

	namedWindow("Video", CV_WINDOW_AUTOSIZE);
	createTrackbar("Frame", "Video", &value, FrameCount, OnChange, &cap);

	Fps = cap.get(CV_CAP_PROP_FPS);  //獲取視頻幀率
	sprintf(strFps, "Fps:%0.1f/s", Fps);  //格式化字符串

	while(1)
	{
		framePos = cap.get(CV_CAP_PROP_POS_FRAMES);  //獲取視頻幀位置
		setTrackbarPos("Frame", "Video", framePos);  //設置滑動條位置
		cap>>frame;
		if(frame.empty())  //取幀失敗
			break;

		putText(frame, strFps, Point(5, 30), CV_FONT_HERSHEY_COMPLEX_SMALL, 1, Scalar(0, 255, 0), 1, 8);
		imshow("Video", frame);
		if(27 == waitKey(1000/Fps) )  //Esc跳出循環退出
			break;
	}

	cap.release();
	destroyAllWindows();
}
圖示:

1、



2、




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章