opencv —— setMouseCallback 响应鼠标操作事件

鼠标操作:setMouseCallback 函数

借助回调函数,实现对鼠标每次操作的相应,即每进行一步鼠标操作,都会执行一次回调函数。

void setMouseCallback(const string& window_name, MouseCallback on_Mouse, void* userdata = 0);
  • window_name,窗口的名字
  • on_Mouse,指定窗口里每次鼠标事件发生时,被调用的函数指针。

这个函数的原型大概形式为 void XXX(int event, int x, int y, int flags, void* param) .

其中 event 是 EVENT_XXX 类型数据,代表鼠标操作事件

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

flags 是 EVENT_FLAG_XXX 类型数据,也代表鼠标操作事件,复杂的

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

  • userdata,用户定义的传递到回调函数的参数,有默认值 0。

 

成员函数:on_Mouse 函数

void XXX(int event, int x, int y, int flags, void* param)
  • event:

EVENT_MOUSEMOVE          0 //滑动

EVENT_LBUTTONDOWN        1 //左键点击

EVENT_RBUTTONDOWN        2 //右键点击

EVENT_MBUTTONDOWN        3 //中键点击

EVENT_LBUTTONUP          4 //左键放开

EVENT_RBUTTONUP          5 //右键放开

EVENT_MBUTTONUP          6 //中键放开

EVENT_LBUTTONDBLCLK      7 //左键双击

EVENT_RBUTTONDBLCLK      8 //右键双击

EVENT_MBUTTONDBLCLK      9 //中键双击

  • flags:

EVENT_FLAG_LBUTTON       1 //左鍵拖曳

EVENT_FLAG_RBUTTON       2 //右鍵拖曳

EVENT_FLAG_MBUTTON       4 //中鍵拖曳

EVENT_FLAG_CTRLKEY       8 //(8~15)按Ctrl不放事件

EVENT_FLAG_SHIFTKEY      16 //(16~31)按Shift不放事件

EVENT_FLAG_ALTKEY        32 //(32~39)按Alt不放事件

  • void* param 标识了所响应的事件函数,相当于自定义了一个 OnMouseAction()函数的ID。

 

代码示例:

#include<opencv.hpp>
using namespace cv;
RNG rngs{ 12345 };
bool bool_draw = false;
Point pre_point;
Mat src, tem;
Scalar color;
void on_mouse(int event, int x, int y, int flags, void* param) {
    switch (event) {
    case EVENT_MOUSEMOVE://鼠标移动
        if (bool_draw == true) {
            tem = src.clone();
            color = Scalar(rngs.uniform(0, 255), rngs.uniform(0, 255), rngs.uniform(0, 255));
            rectangle(tem, pre_point, Point(x, y), color);
            imshow("show", tem);
        }
        break;
    case EVENT_LBUTTONDOWN://鼠标左键按下
        bool_draw = true;
        pre_point = Point(x, y);
        break;
    case EVENT_LBUTTONUP://鼠标左键抬起
        bool_draw = false;
        rectangle(src, pre_point, Point(x, y), color);
        break;
    }
}
int main() {
    src = Mat::zeros(600, 800, CV_8UC3);
    namedWindow("show");
    setMouseCallback("show", on_mouse);
    waitKey(0);
}

 

效果展示:

 

借鉴博客:https://blog.csdn.net/dcrmg/article/details/52027847

 

posted @ 2020-02-10 13:46  狂奔的小学生  阅读(2729)  评论(0编辑  收藏  举报