鼠标操作: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--->const 用法总结

    const 用法总结 宏.变量.常量区分 宏:只是在预处理器里进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化.只保存一份到 .rodata 段.甚至有相同后缀的字符串也可以 ...

  2. SpringBoot消息篇Ⅲ --- 整合RabbitMQ

    知识储备:  关于消息队列的基本概念我已经在上一篇文章介绍过了(传送门),本篇文章主要讲述的是SpringBoot与RabbitMQ的整合以及简单的使用. 一.安装RabbitMQ 1.在linux上 ...

  3. 事务管理(ACID)

    目录 一.事务管理(ACID) 原子性(Atomicity) 一致性(Consistency) 持久性(Durability) 隔离性(Isolation) 二.事务隔离级别 脏读 不可复读 虚读(幻 ...

  4. 【译】SQ3R学习法则

    SQ3R 观察-提问-阅读-复述-回顾 背景 SQ3R是一种理解策略,可帮助学生在阅读时思考他们正在阅读的文章. SQ3R通常被归类为学习策略,通过教导学生在初次阅读一篇文章时如何阅读和像高效读者一样 ...

  5. YUM安装软件提示[Errno 14] curl#6 - "Could not resolve host: mirrors.cloud.aliyuncs.com; 未知的错误"

    报错如下: 翻译过来就是 所以问题很简单: 第一种情况:本地DNS服务错误 第二种情况:远程主机挂了 第三种情况:远程主机地址配置错误 第一种解决方法:换DNS 首先验证一下是不是本地DNS错误 从上 ...

  6. 机器学习-NLP之Word embedding 原理及应用

    概述 自然语言是非常复杂多变的,计算机也不认识咱们的语言,那么咱们如何让咱们的计算机学习咱们的语言呢?首先肯定得对咱们的所有文字进行编码吧,那咱们很多小伙伴肯定立马就想出了这还不简单嘛,咱们的计算机不 ...

  7. 《windows程序设计》第三章学习心得

    第三章是基于对一个windows窗口的学习,来达到对windows程序运行机制的理解. 从语言的角度看消息机制,Windows给程序发消息的本质就是调用"窗口过程"函数. Don' ...

  8. Codeforces_849

    A.只要考虑分成一个串的情况就可以了. #include<bits/stdc++.h> using namespace std; ]; int main() { ios::sync_wit ...

  9. Codeforces_818

    A.winners总数为(k+1)diplomas. #include<bits/stdc++.h> using namespace std; long long n,k; int mai ...

  10. 【CMake】CMake GUI构建VS等项目

    一.CMake官网(https://cmake.org/)上的介绍: CMake is an open-source, cross-platform family of tools designed ...