OpenCv鼠标事件

小白上路滴滴滴!!

首先是鼠标事件回调函数

这个函数只有声明,不需要在main函数中被调用,触发方法是通过鼠标的动作进行触发。

首先编写回调函数(这个函数由开发者编写,名字不重要)

void your_mouse_callback(
int event;
int x;
int y;
int flags;
void* param ;
)

这是我们编写的鼠标回调函数下面我们具体解释一下每一个参数的含义

第一个参数event,这是鼠标的触发事件,也就是说如果鼠标执行了特定条件那么这个回调函数会被执行,具体有以下回调函数

enum
{
    CV_EVENT_MOUSEMOVE      =0,   //鼠标移动
    CV_EVENT_LBUTTONDOWN    =1,   //按下左键
    CV_EVENT_RBUTTONDOWN    =2,   //按下右键
    CV_EVENT_MBUTTONDOWN    =3,   //按下中键
    CV_EVENT_LBUTTONUP      =4,   //放开左键
    CV_EVENT_RBUTTONUP      =5,   //放开右键
    CV_EVENT_MBUTTONUP      =6,   //放开中键
    CV_EVENT_LBUTTONDBLCLK  =7,   //左键双击
    CV_EVENT_RBUTTONDBLCLK  =8,   //右键双击
    CV_EVENT_MBUTTONDBLCLK  =9,   //中键双击
    CV_EVENT_MOUSEWHEEL     =10,  //滚轮滚动
    CV_EVENT_MOUSEHWHEEL    =11   //横向滚轮滚动(还好我鼠标是G502可以这么干)
};

第二个参数和第三个参数代表的是鼠标此时在的位置,比如说鼠标这时点击窗口那么就会把此时鼠标点击的xy位置信息返回,这个参数是并不是我们填入的,而是鼠标事件触发时鼠标位置决定。

第四个参数是鼠标事件参数有如下参数


enum
{
    CV_EVENT_FLAG_LBUTTON   =1,   //左键拖拽
    CV_EVENT_FLAG_RBUTTON   =2,   //右键拖拽
    CV_EVENT_FLAG_MBUTTON   =4,   //中键拖拽
    CV_EVENT_FLAG_CTRLKEY   =8,   //按住CTRL拖拽
    CV_EVENT_FLAG_SHIFTKEY  =16,  //按住Shift拖拽
    CV_EVENT_FLAG_ALTKEY    =32   //按住ALT拖拽
};

这个参数就算没有也问题不大,如果需要在鼠标事件发生时同时有键盘事件输入,我们可以在编写执行函数的触发条件时,将此时鼠标事件和标志位同时满足作为条件比如说:

Rect box;
void draw_box(Mat& img,Rect box)
{
rectangle(
img,
box.tl(),
box.br(),
Scalar(0x00,0x00,0xff);
)
}
void my_mouse_callback(
int event;
int x;
int y;
int flags;
void* param;
)
{
Mat& image=*(Mat*)param;//将第五个参数代表的信息传给image,这个参数具体我们在后面还会提及
if(flags==EVENT_MOSEMOVE&&flags==EVENT_FLAG_SHIFTKEY)
{
box=Rect(x,y,10,10);
draw_box(image,box);
}
}

这是一部分代码片段,只有在同时移动鼠标和按下shift键才能触发回调函数执行画矩形函数

接着我们说第五个参数,这个参数用来传递信息的,就比如我们有一个mat数组就可以通过这个参数传递给回调函数供回调函数使用

写了这么多但是我们的opencv它还不认识这个函数,因为对我们的opencv来说这可以是一个普通函数对吗,所以我们需要一个注册函数告诉编译器我们的回调函数,这个函数是由官方给的

void setMouse Callback(
const string& windowName,
MoseCallback on_mose,
void* param
)

第一个参数是窗口的名字

第二个参数是回调函数的名字

第三个参数同回调函数里的param是一个参数,用来传递信息,void*类型可以转换为任何地址类型,这个地方很巧妙

因此我们只需要在main中使用了这个注册函数,那么就可以触发回调函数。

有什么错误的地方还请大家提出,第一次写,谢谢。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值