一、主要功能
(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、