鼠标操作: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. Redhat6.7 切换Centos yum源

    转自:http://inlhx.iteye.com/blog/2336729 RedHat 更换Yum源 1.检查yum包 rpm -qa |grep yum 2.删除自带包 rpm -aq | gr ...

  2. Web自动化测试项目搭建(一) 需求与设计

    一.项目需求 测试/生产环境更新后,自动化回归测试 项目易于维护和运行 支持多种测试策略 支持可视化测试报告 运行结果,支持多种方式通知相关人员 可定时/触发的方式运行自动化测试用例 二.设计 2.1 ...

  3. 浅谈DFS,BFS,IDFS,A*等算法

    搜索是编程的基础,是必须掌握的技能.--王主任 搜索分为盲目搜索和启发搜索 下面列举OI常用的盲目搜索: 1.dijkstra 2.SPFA 3.bfs 4.dfs 5.双向bfs 6.迭代加深搜索( ...

  4. tensorflow 案例

    import tensorflow as tf import numpy as np #添加一层inputs输入的数据,in_size为输入节点数,out_size为输出节点数,下一个为激励函数 de ...

  5. ubuntu19配置静态IP并开启SSH远程登陆

    前言  从ubuntu从17.10开始,已经不再在/etc/network/interfaces里配置IP,即使配置了也不会生效,而是改成netplan方式 ,配置写在/etc/netplan/文件夹 ...

  6. python学习Day05--字典

    [主要内容] 1. dict 用大括号{} 括起来. 内部使用key:value的形式来保存数据 {'jay':'周杰伦', "jj":'林俊杰'} 注意:字典的key必须是可哈希 ...

  7. C++ 类模板详解(一):概念和基本使用方式

    与函数模板类似地(C++函数模板详解(一):概念和特性) ,类也可以被一种或多种类型参数化.例如,容器类就是一个具有这种特性的典型例子,它通常被用于管理某种特定类型的元素.只要使用类模板,我们就可以实 ...

  8. provider networks和self-service networks

    Provider Network 服务布局 Self-Service Network 网络布局: 网络布局 Provider Networks概述  Provider networks - Conne ...

  9. 八使用Shell函数

    在Shell脚本中,将一些需要重复使用的操作,定义为公共的语句块,即可称为函数 使用函数的好处? 使脚本代码更简洁,增强易读性 提高Shell脚本的执行效率 函数定义方法 基本格式1 function ...

  10. java核心技术----接口

    接口:用来描述类具有什么功能,而并不给出每个功能的具体实现. 一个类可以实现一个或多个接口. 克隆(深拷贝):创建一个新对象,且新的对象的状态与原始对象的状态相同.当对克隆的新对象进行修改时,不会影响 ...