主要介绍
鼠标事件的函数原型及参数
回调函数的原型及参数
鼠标事件画矩形的例子
指定鼠标操作消息回调函数的函数为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))); }
效果: