C++ opencv鼠标事件,在图像上画矩形

文章目录

  • 使用鼠标图像上画出矩形

使用鼠标图像上画出矩形

opencv中常用的除了TrackBar滑动条事件,还有丰富的鼠标事件,与TrackBar类似,鼠标事件也是使用回调函数判断动作的发生,并执行相关的操作。整个行为与QT的信号与槽类似。
在图像中画出矩形,需要使用setMouseCallback()和MouseCallback()函数。

本文使用的头文件及命名空间:

#pragma once
#include 
#include 

using namespace std;
using namespace cv;

设置鼠标回调函数:
C++ opencv鼠标事件,在图像上画矩形_第1张图片

winname :显示图像的窗口名
onMouse : 自定义的鼠标回调函数
userdata : 输入的无类型指针参数,即Mat图像的地址

鼠标回调函数:取名可以不同,但是参数类型与数目需要一致
C++ opencv鼠标事件,在图像上画矩形_第2张图片

event : 鼠标事件中的某一种
x : 当前鼠标的位置的横坐标
y :当前鼠标的位置的纵坐标
flags : 鼠标事件标志的某一种
userdata : 传入的无类型指针参数

鼠标事件类型:
C++ opencv鼠标事件,在图像上画矩形_第3张图片
测试代码:

使用鼠标在图像上画出矩形,需要记录鼠标按下的起始位置作为矩形的左上角。

//--------------------------【Opencv中的鼠标点击事件】----------------------------
//全局变量
//保存鼠标按下的起始点
Point2i startP;

//声明回调函数
void myMouseevent(int event, int x, int y, int flags, void* userdata) {
	
	//imshow("image show", *(Mat*)userdata);
	Mat dst= (*(Mat*)userdata).clone();
	//判断左键按下,记录起始点坐标
	if (event == EVENT_LBUTTONDOWN) {
		startP.x = x;
		startP.y = y;
	}
	//鼠标左键为按下状态,显示需要画的矩形,只能画出鼠标左下角移动的矩形
	if ( flags == EVENT_FLAG_LBUTTON) {
		//计算需画的矩形
		Rect rect(startP.x, startP.y, x - startP.x, y - startP.y);
		//在图像上画出矩形
		rectangle(dst, rect, Scalar(0, 0, 250), 2,4);
		imshow("image show", dst);
	}
	//左键松开,在原图像画出矩形
	if (event == EVENT_LBUTTONUP ) {
		Rect rect(startP.x, startP.y, x - startP.x, y - startP.y);
		rectangle(*(Mat *)userdata, rect, Scalar(0, 0, 250), 2, 4);
		imshow("image show", *(Mat*)userdata);
	}
	
}

//鼠标事件测试,在图像上画矩形。
void mouseEventTest() {
	Mat src = imread(path, 1);
	namedWindow("image show", WINDOW_AUTOSIZE);
	imshow("image show", src);
	setMouseCallback("image show", myMouseevent, &src);
	waitKey(0);
}

测试结果:
C++ opencv鼠标事件,在图像上画矩形_第4张图片
C++ opencv鼠标事件,在图像上画矩形_第5张图片

上述代码,没有做鼠标移动前后坐标相对位置的判断,即只有当移动后的位置的横纵坐标均大于等于移动前时,才可以画出矩形。如果需要任意方向画出矩形,则需在画矩形部分添加判断相对位置代码。

你可能感兴趣的:(OpenCV451,opencv,c++,计算机视觉)