(1)回调函数

OpenCV中setMouseCallback()创建了一个鼠标回调函数,每次在图像上单击鼠标左键再抬起的过程,都会分3次调用鼠标响应函数,并且响应顺序是:
1.左键单击按下;
2.左键单击抬起;
3.鼠标指针位置移动(即使原地单击,鼠标位置并没有移动);

函数声明如下:

CV_EXPORTS void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata = 0); 

函数参数介绍
const string& winname,windows视窗名称,对名为winname的视窗进行鼠标监控。
MouseCallback onMouse,鼠标响应处理函数,监听鼠标的点击,移动,松开,判断鼠标的操作类型,并进行响应的函数处理。
void* userdata = 0 鼠标响应处理函数的ID,与鼠标相应处理函数相匹配就行,暂时只用到默认为0的情况。

函数使用实例:

namedWindow("img");
setMouseCallback("img",on_mouse,0); 

(2)响应处理函数

opencv2中,鼠标相应处理函数一般默认形参和返回参数,函数形式如下:

void on_mouse(int event,int x,int y,int flags,void *ustc)  

函数参数介绍:
int event,鼠标操作时间的整数代号,在opencv2中,event鼠标事件总共有10中,从0-9依次代表如下:

#define CV_EVENT_MOUSEMOVE 0 滑动
#define CV_EVENT_LBUTTONDOWN 1 左键点击
#define CV_EVENT_RBUTTONDOWN 2 右键点击
#define CV_EVENT_MBUTTONDOWN 3 中间点击
#define CV_EVENT_LBUTTONUP 4 左键释放
#define CV_EVENT_RBUTTONUP 5 右键释放
#define CV_EVENT_MBUTTONUP 6 中间释放
#define CV_EVENT_LBUTTONDBLCLK 7 左键双击
#define CV_EVENT_RBUTTONDBLCLK 8 右键双击
#define CV_EVENT_MBUTTONDBLCLK 9 中间释放

int x,int y,代表鼠标位于窗口的(x,y)坐标位置,窗口左上角默认为原点,向右为x轴,向下为y轴,

int flags,代表鼠标的拖拽事件,以及键盘鼠标联合事件,总共有32种事件,依次如下:
flags:
#define CV_EVENT_FLAG_LBUTTON 1 左键拖拽
#define CV_EVENT_FLAG_RBUTTON 2 右键拖拽
#define CV_EVENT_FLAG_MBUTTON 4 中间拖拽
#define CV_EVENT_FLAG_CTRLKEY 8 (8~15)按Ctrl不放事件
#define CV_EVENT_FLAG_SHIFTKEY 16 (16~31)按Shift不放事件
#define CV_EVENT_FLAG_ALTKEY 32 (32~39)按Alt不放事件

简单的实例如下:

#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include<iostream>
using namespace cv;
using namespace std;
void on_mouse(int event,int x,int y,int flags,void *ustc);  //鼠标回调事件函数
int static times; //记录调用次数
int main(int argc,char*argv[])
{  Mat image=imread("e:\\kobe.jpg");  imshow("image",image);  setMouseCallback("image",on_mouse);  waitKey();  system("pause");
}
//鼠标回调函数
void on_mouse(int event,int x,int y,int flags,void *ustc)
{     times++;  cout<<"第 "<<times<<" 次回调鼠标事件"<<endl;  if(event==CV_EVENT_MOUSEMOVE)  {  cout<<"触发鼠标移动事件"<<endl;  }  if(event==CV_EVENT_LBUTTONDOWN)  {  cout<<"触发左键按下事件"<<endl;  }  if(event==CV_EVENT_LBUTTONUP)  {  cout<<"触发左键抬起事件"<<endl;  }  if(event==CV_EVENT_RBUTTONDOWN)  {  cout<<"触发右键按下事件"<<endl;  }  if(event==CV_EVENT_RBUTTONUP)  {  cout<<"触发右键抬起事件"<<endl;  }  if(event==CV_EVENT_LBUTTONDBLCLK)  {  cout<<"触发左键双击事件"<<endl;  }  if(event==CV_EVENT_RBUTTONDBLCLK)  {  cout<<"触发右键双击事件"<<endl;  }
}  

运行结果如下:

复杂一点的例子,用鼠标在一幅图上画线,程序如下:

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
#define WINDOW "原图"
Mat g_srcImage,g_dstImage;
Point previousPoint;
bool P = false;
void On_mouse(int event, int x, int y, int flags, void*);
int main()
{  g_srcImage = imread("e://kobe.jpg");  imshow(WINDOW, g_srcImage);  setMouseCallback(WINDOW, On_mouse, 0);  waitKey(0);  return 0;
}
void On_mouse(int event, int x, int y, int flags, void*)
{  if (event == EVENT_LBUTTONDOWN)  {  previousPoint = Point(x, y);  }  else if (event == EVENT_MOUSEMOVE && (flags&EVENT_FLAG_LBUTTON))  {  Point pt(x, y);  line(g_srcImage, previousPoint, pt, Scalar(0,0,255), 2, 5, 0);  previousPoint = pt;  imshow(WINDOW, g_srcImage);  }
}  

运行结果如下:

程序中用到了line()函数,后面单独总结一章:opencv基本绘图函数。

参考:

http://blog.csdn.net/xiaowei_cqu/article/details/8778976

http://www.eefocus.com/FthDesigner/blog/13-04/293698_9d0d0.html

http://blog.csdn.net/zhangping1987/article/details/51878636

http://blog.csdn.net/qq_29540745/article/details/52562101

OPENCV中操作鼠标相关推荐

  1. OpenCV-Python实战(番外篇)——OpenCV中利用鼠标事件动态绘制图形

    OpenCV-Python实战(番外篇)--OpenCV中利用鼠标事件动态绘制图形 使用鼠标事件动态绘制 动态绘制图形 动态绘制图形和文本 相关链接 使用鼠标事件动态绘制 我们已经在<OpenC ...

  2. 7 .opencv中把鼠标当画笔使用

    学习目标 : 1.学会使用OpenCV 处理鼠标事件 2.掌握cv2.setMouseCallback()方法的使用 内容说明: 鼠标事件可以是鼠标上的任何动作,比如左键按下.左松开左.双击等. 我们 ...

  3. Opencv中的鼠标事件

    在Opencv当中的highgui模块中有大量可以用来处理图像的函数,他们可以使程序对鼠标或者键盘事件做出相应,也可以在图像上绘制形状或者写入文本. 这里主要说一下鼠标事件. 功能 通过编程,你可以让 ...

  4. OpenCV中响应鼠标信息cvSetMouseCallback函数的使用

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

  5. Opencv中鼠标作为画笔

    目标 学习处理OpenCV中的鼠标事件 您将学习以下功能:cv2.setMouseCallback() 简单演示 在这里,我们创建了一个简单的应用程序,它在图像上画一个圆圈,只要我们双击它. 首先,我 ...

  6. OpenCV中感兴趣区域的选取与检测(一)

    1.感兴趣区域的选取 感兴趣区域(Region of Interest, ROI)的选取,一般有两种情形:1)已知ROI在图像中的位置:2)ROI在图像中的位置未知. 1)第一种情形 很简单,根据RO ...

  7. Python OpenCV:利用鼠标移动缩放图片

    一.实现目标   在OpenCV中通过鼠标左键拖拽移动图片,通过鼠标滚轮前后旋转放大缩小图片. 二.实现背景   在前一篇博客在OpenCV中使用滚动条显示大图中发现自己画滚动条移动大图略显繁琐,且缩 ...

  8. OpenCV中的GUI特性 —— 绘图+鼠标画笔+轨迹栏调色板

    OpenCV中的GUI特性 -- 绘图+鼠标画笔+轨迹栏调色板 这一部分内容主要包括OpenCV的绘图函数.鼠标回调函数与画图的结合和轨迹栏的使用,绘图函数的传参是关键,鼠标回调函数也是一个相当重要的 ...

  9. OpenCV中图像形态学操作

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:视学算法 图像形态学是图像处理的分支学科,在二值图像处理 ...

  10. Opencv中三种操作像素的方法

    测试环境:opencv3.1.0 + Visual Studio 2015 + win7 64位 opencv中有3中方法可以访问/修改图像的像素值,分别为: 1.      指针访问 2.      ...

最新文章

  1. python【蓝桥杯vip练习题库】ADV-97十进制数转八进制数
  2. 创建带有关联的 XML 架构的 XML 文件 从 XML 文件创建 XML 架构
  3. python链接mysql系统结构设计_MySQLpython交互
  4. 第六十三期:微软与阿里云合作推出“开放应用模型(OAM)”
  5. 隔离式BUCK之参数计算
  6. Teamcenter2007 开发环境搭建和技巧
  7. python 动态类型性能_动态且强类型的Python
  8. 关于第五届全国高校新一代信息技术暑假教师培训班的通知
  9. DataTable中的数据导出Excel文件
  10. python发送邮件程序
  11. deeplearning 源码收集
  12. C语言-字符数组和字符串
  13. KEIL平台下新建华大HC32F460单片机工程笔记
  14. poi根据模板导出word
  15. 使用scrapy框架爬取携程旅行数据
  16. 帮我写一段描写时间过得很快,但是自己又很不想时间过得那么快的小作文
  17. DDSM+RetinaNet数据处理进展
  18. EPICS记录参考2--EPICS过程数据库概念
  19. dcb模式(dcb模式)
  20. Tomcat 部署多个SpringBoot 项目:ERROR org.springframework.boot.actuate.endpoint.jmx.EndpointMBeanExporter

热门文章

  1. 在RobotFramework--RIDE中把日期转化为整型进行运算
  2. 指令篇:文件的创建和时间修改___touch
  3. MySQL · 引擎特性 · 基于InnoDB的物理复制实现(转载)
  4. UIDatePicker 显示时间和打印时间不一样
  5. 使用EntityFramework连接 Mysql
  6. Go开源项目 - gorp使用方法
  7. Android-AlarmManager(全局定时器/闹钟)
  8. Thingsboard 3.1.0 - 规则链:转换数据结构
  9. Protobuf3详细介绍
  10. C3P0组件+DbUtils组件实现一个JdbcUtils工具类