鼠标操作: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{ };
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(, ), rngs.uniform(, ), rngs.uniform(, ));
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(, , CV_8UC3);
namedWindow("show");
setMouseCallback("show", on_mouse);
waitKey();
}

效果展示:

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

opencv —— setMouseCallback 响应鼠标操作事件的更多相关文章

  1. OpenCV之响应鼠标(四):在图像上绘制出矩形并标出起点的坐标

    涉及到两方面的内容:1. 用鼠标画出矩形.2.在图像上绘制出点的坐标 用鼠标绘制矩形,涉及到鼠标的操作,opencv中有鼠标事件的介绍.需要用到两个函数:回调函数CvMouseCallback和注册回 ...

  2. OpenCV之响应鼠标(二):函数cvSetMouseCallback()和其副程式onMouse()的使用(OpenCV2.4.5)

    每當滑鼠在視訊視窗介面點擊一下的時候,都會有固定三個動作 1.點擊(Click) 2.放開(Down)3.滑動(move) 因此,程式執行滑鼠在點擊的時候onMouse()都會連續跑三次,代表滑鼠在點 ...

  3. OpenCV中响应鼠标消息 (转)

    #include <cv.h> #include <highgui.h> #include <stdio.h> #pragma comment(lib," ...

  4. OpenCV之响应鼠标(三):响应鼠标信息

    转自:http://blog.csdn.net/haihong84/article/details/6599838 程序代碼如下: #include <cv.h>#include < ...

  5. WPF滚动条嵌套,响应鼠标滑轮事件的处理

    在C# 中,两个ScrollViewer嵌套在一起或者ScrollViewer里面嵌套一个ListBox.Listview(控件本身有scrollviewer)的时候,我们本想要的效果是鼠标滚动整个S ...

  6. OpenCV之响应鼠标(一):利用鼠标获取坐标

    好久没有更新博客了,今天临时起意,将以前写的示例代码整理了一下,暂且发布一篇,希望对大家有用! 代码一:点击时显示坐标,鼠标移动时不显示. #include <cv.h> #include ...

  7. 滚动条响应鼠标滑轮事件实现上下滚动的js代码

    <script type="text/javascript"> var scrollFunc=function(e){ e=e || window.event; if( ...

  8. HighGUI图形图像界面初步——鼠标操作

    OpenCV中的鼠标操作和滑动条的消息映射方式很类似,都是通过一个中介函数配合一个回调函数来实现的,创建和指定滑动条回调函数为createTrackbar, 而指定鼠标操作消息回调函数的函数为setM ...

  9. TScrollBox响应鼠标滚轮问题

    Delphi的TScrollBox本身并不响应鼠标滚轮事件(不知道为什么),但可以在ScrollBox的鼠标滚动事件中进行控制: procedure TfrmTaskNoteEdit.ScrollBo ...

随机推荐

  1. ios--->instrument的leaks来检查内存泄漏

    instrument来检查内存泄漏 1.第一步打开 或者: 然后选择leaks 2.若此时编译出现如下问题,可能是非debug版本造成的,切换成debug版本即可 打开工程的Edit Scheme选项 ...

  2. webpack4.0 ---引用vue文件

    一.引入Vue 1.安装依赖环境 npm i vue-loader -D;//解析转化.vue文件,npm i vue-style-loader -D npm i vue-template-compi ...

  3. 脚本在Shell可以执行成功,放到crontab里执行失败

    一.背景 自己写了个监控MGR状态的脚本,直接在Linux的Shell环境下可以执行成功,但是只要放到crontab里执行,就失败,脚本内容如下 #!/bin/bash MAIL_ADDR=`cat ...

  4. Java支付宝PC网站支付功能开发(详细教程)

    一.前言 本案例使用的是Java实现的.使用支付宝的沙盒环境示例.发布需要换成正式环境.这里就不作详细说明了 本代码适合用来做参考,不要直接复制去使用. 没有账号的需要去平台注册一个: 登录支付宝开发 ...

  5. JSP&Servlet学习笔记----第3章

    Web容器是JSP/Servlet唯一认识的HTTP服务器. HTTP是基于请求/响应的无状态通信协议. 流程: 1.请求来到HTTP服务器 2.HTTP服务器将请求转交给Web容器 3.Web容器创 ...

  6. 快速了解Lambda表达式-Java

    目录 lambda表达式 前言 简介 简单入门 用法 好处 总结 lambda表达式 前言 最近因为疫情,也不能正常返校什么的,希望大家都能好好的,希望武汉加油,中国加油,在家也看了很多视频,学了一点 ...

  7. SpringBoot Jpa 分页查询最新配置方式

    这是已经被废弃的接口 Sort sort = new Sort(Sort.Direction.DESC,"bean类中字段"); //创建时间降序排序 Pageable pagea ...

  8. 题解 CSP2019-J2T4【加工零件】

    这题我们要求的是啥呢?仔细读题可以发现,工人传送带的关系可以看成一个 \(n\) 个点和 \(m\) 条边的无向图,然后对于每组询问 \((a,L)\),其实就是问: \(1\) 到 \(a\) 有没 ...

  9. 【Java并发工具类】ReadWriteLock

    前言 前面介绍过ReentrantLock,它实现的是一种标准的互斥锁:每次最多只有一个线程能持有ReentrantLock.这是一种强硬的加锁规则,在某些场景下会限制并发性导致不必要的抑制性能.互斥 ...

  10. layui表格增删改查与上传图片+Api

    API  控制器1 主要用于增删改查已经反填数据查询 using System; using System.Collections.Generic; using System.Data.SqlClie ...