openCV学习笔记(四) —— 鼠标截图、滑动条播放视频

一、鼠标截图

#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;
}

猜你喜欢

转载自blog.csdn.net/guoyunfei123/article/details/81104161