第四天:鼠标截图+滑动条播放视频实例

一、主要功能

(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、




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