一、鼠标截图
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
Mat inImage = imread("test.jpg");
Mat outImage = inImage.clone();
bool flag = false;
Point pt;
Mat ROI;
void onMouse(int event, int x, int y, int flag, void *param)
{
switch (event)
{
case CV_EVENT_LBUTTONDOWN: //鼠标左键按下
printf("鼠标左键按下\n");
flag = true;
pt.x = x;
pt.y = y;
break;
case CV_EVENT_MOUSEMOVE:
printf("鼠标移动\n");
if (flag)
{
inImage.copyTo(outImage); //将原图像赋值给temp,以便永远只有一个矩形(否则许多矩形会重叠在一起)
rectangle(outImage, pt, Point(x, y), Scalar(0, 255, 0), 2, 8);
}
break;
case CV_EVENT_LBUTTONUP:
printf("鼠标左键抬起\n");
flag = false;
ROI = outImage(Rect(pt.x, pt.y, x - pt.x, y - pt.y)); //确定ROI区域,有矩形边框
//ROI = inImage(Rect(pt.x, pt.y, x - pt.x, y - pt.y));//无矩形边框
imshow("Out", ROI);
imwrite("ROI.jpg", ROI);
break;
default:
break;
}
}
int main()
{
namedWindow("inWindows", CV_WINDOW_AUTOSIZE);
setMouseCallback("inWindows", onMouse, 0);
while (1)
{
imshow("inWindows", outImage);
if (27 == waitKey(30))
{
break;
}
}
destroyAllWindows();
return 0;
}
二、滑动条播放视频
/*
滑动条视频播放
*/
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int value;
void onChange(int pos, void *param)
{
VideoCapture cap = *(VideoCapture *)param;
cap.set(CV_CAP_PROP_POS_FRAMES, value); //设置视频帧位置
}
int main()
{
Mat frame;
VideoCapture capture;
capture.open("test.avi");
if (!capture.isOpened())
{
printf("can't open video file\n");
return -1;
}
int fps = (int)capture.get(CV_CAP_PROP_FPS); //获取视频帧率
int frameCount = (int)capture.get(CV_CAP_PROP_FRAME_COUNT); //获取视频总帧数
namedWindow("video", CV_WINDOW_AUTOSIZE);
createTrackbar("frame", "video", &value, frameCount, onChange, (void *)&capture);
while (true)
{
int framePos = (int)capture.get(CV_CAP_PROP_POS_FRAMES);
setTrackbarPos("frame", "video", framePos);
capture.read(frame);
imshow("video", frame);
if (27 == waitKey(1000 / fps))
{
break;
}
}
capture.release();
destroyAllWindows();
return 0;
}