opencv 之 鼠标事件,回调函数

主要介绍

    鼠标事件的函数原型及参数

    回调函数的原型及参数

    鼠标事件画矩形的例子

指定鼠标操作消息回调函数的函数为SetMouseCallback函数。

函数原型:

      void   SetMouseCallback(const string & winname,MouseCallback onMouse,void* userdata=0)

参数:

第一个参数为窗口的名字,

第二个参数用来指定窗口每次鼠标时候发生的时候,被调用函数指针,

第三个参数则为用户定义的传递到回调函数的参数。

其中函数指针原型:

void Foo(int event ,int x ,int y ,int flags  ,void * param)。

参数:

event 是鼠标响应类型,CV_EVENT_*变量之一:

EVENT_MOUSEMOVE滑动

EVENT_LBUTTONDOWN 左击

EVENT_RBUTTONDOWN 右击

 

EVENT_MBUTTONDOWN中键点击

EVENT_LBUTTONUP 左键放开

EVENT_RBUTTONUP 右键放开

 

EVENT_LBUTTONDBLCLK左键双击

EVENT_RBUTTONDBLCLK 右键双击

EVENT_MBUTTONDBLCLK 中键双击

x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系)。

flags是CV_EVENT_FLAG的组合,flag的状态有:

EVENT_FLAG_LBUTTON 左键拖拽

EVENT_FLAG_RBUTTON 右键拖拽

EVENT_FLAG_MBUTTON 中键拖拽

EVENT_FLAG_CTRLKEY 按住Ctrl不放

EVENT_FLAG_SHIFTKEY 按住Shift不放

EVENT_FLAG_ALTKEY 按住Alt不放

param是用户定义的传递到setMouseCallback函数调用的参数。

通过鼠标回调函数绘制矩形代码如下:

void MouseEvent();    //主函数
void on_MouseHandle(int event,int x, int y, int flag, void* param);    //回调函数

void DrawRectangle(Mat& img,Rect box);    //画矩形

/*****************鼠标操作*****************/
Rect g_rect;
bool g_DrawFlag = false;
RNG g_rng(12345);
void MouseEvent()
{
	//准备参数
	g_rect = Rect(-1, -1, 0, 0);
	Mat srcImage(600, 600, CV_8UC3), tempImage;
	srcImage.copyTo(tempImage);
	g_rect = Rect(-1, -1, 0, 0);
	srcImage = Scalar::all(0);

	//设置鼠标操作回调函数
	namedWindow("Win");
	setMouseCallback("Win", on_MouseHandle, (void*)&srcImage);
	
	//绘画
	while (1)
	{
		srcImage.copyTo(tempImage);
		if (g_DrawFlag) {
			DrawRectangle(tempImage, g_rect);
		}
		imshow("Win", tempImage);
		if (waitKey(10) == 27) break;//ESC 退出
	}
}
//鼠标回调事件
void on_MouseHandle(int event, int x, int y, int flag, void* param)
{
	Mat& image = *(Mat*)param;
	switch (event)
	{
	case EVENT_MOUSEMOVE://移动
		if (g_DrawFlag) {
			//计算,g_rect宽高=鼠标当前位置坐标-g_rect左上角的坐标
			g_rect.width = x - g_rect.x;
			g_rect.height = y - g_rect.y;
		}
		break;
	case EVENT_LBUTTONDOWN://左键按下
		g_DrawFlag = true;
		//设置g_rect的初始值在同一个点
		g_rect = Rect(x, y, 0, 0);
		break;
	case EVENT_LBUTTONUP://左键抬起
		g_DrawFlag = false;
		//当g_rect宽高小于0
		//起始点xy坐标置为较小靠左上角的点
		//宽高取绝对值
		if (g_rect.width < 0) {
			g_rect.x += g_rect.width;
			g_rect.width *= -1;
		}
		if (g_rect.height < 0) {
			g_rect.y += g_rect.height;
			g_rect.height *= -1;
		}
		//画矩形
		DrawRectangle(image, g_rect);
		break;
	}
}
//矩形绘制函数
void DrawRectangle(Mat& img, Rect box)
{
	//rectangle画矩形
	//tl左上角的点,br右下角的点
	//Scalar设置颜色,设置为3通道
	//g_rng.uniform(0, 255)随机颜色
	rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255),
		g_rng.uniform(0, 255), g_rng.uniform(0, 255)));
}

效果:


猜你喜欢

转载自blog.csdn.net/jinmie0193/article/details/79970293