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