• 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

  • 相关阅读:
    原型模式
    创造者模式
    抽象工厂模式
    工厂方法模式
    简单工厂模式
    HiveQl 基本查询
    使用VMware安装linux虚拟机以及相关配置
    大数据测试
    使用Pycharm创建一个Django项目
    LoadRunner监控window系统各项指标详解
  • 原文地址:https://www.cnblogs.com/bjxqmy/p/11914601.html
Copyright © 2020-2023  润新知