opencv鼠标响应函数_Opencv函数setMouseCallback鼠标事件响应

本文详细介绍了OpenCV中如何使用setMouseCallback()函数响应鼠标事件,包括左键单击、抬起、移动等操作,以及如何创建和使用鼠标回调函数OnMouseAction(),通过实例展示了在图像上绘制直线、矩形和圆的简单应用。
摘要由CSDN通过智能技术生成

用户通过鼠标对图像视窗最常见的操作有:

1. 左键单击按下

2. 左键单击抬起

3. 左键按下拖动

4. 鼠标指针位置移动

单次单击操作响应事件及顺序

Opencv中setMouseCallback()创建了一个鼠标回调函数,每次在图像上单击鼠标左键再抬起的过程,都会分3次调用鼠标响应函数,并且响应顺序是:

1.左键单击按下;

2.左键单击抬起;

3.鼠标指针位置移动(即使原地单击,鼠标位置并没有移动);

可以编码验证一下回调函数的这个调用机制:

#include "core/core.hpp"

#include "highgui/highgui.hpp"

#include "imgproc/imgproc.hpp"

#include

using namespace cv;

using namespace std;

void OnMouseAction(int event,int x,int y,int flags,void *ustc); //鼠标回调事件函数

int static times; //记录调用次数

int main(int argc,char*argv[])

{

Mat image=imread(argv[1]);

imshow("image",image);

setMouseCallback("image",OnMouseAction);

waitKey();

system("pause");

}

//*******************************************************************//

//鼠标回调函数

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

{

times++;

cout<

if(event==CV_EVENT_MOUSEMOVE)

{

cout<

}

if(event==CV_EVENT_LBUTTONDOWN)

{

cout<

}

if(event==CV_EVENT_LBUTTONUP)

{

cout<

}

if(event==CV_EVENT_RBUTTONDOWN)

{

cout<

}

if(event==CV_EVENT_RBUTTONUP)

{

cout<

}

if(event==CV_EVENT_LBUTTONDBLCLK)

{

cout<

}

if(event==CV_EVENT_RBUTTONDBLCLK)

{

cout<

}

}

前3次调用是在左键单击前鼠标指针在图像窗口移动造成的。不移动位置,单击左键,触发了第4次调用,红色框框内的就是一个完整的鼠标按下再抬起的调用过程:

第一次传入的event事件是左键单击“CV_EVENT_LBUTTONDOWN”;

第二次传入的event事件是左键抬起“CV_EVENT_LBUTTONUP”;

第三次传入的event事件是鼠标移动“CV_EVENT_MOUSEMOVE”,这时候鼠标物理位置其实并没有移动;

setMouseCallback()函数

了解了鼠标回调函数的调用机制后再来看一下创建回调函数的函数setMouseCallback();

原型:

void setMouseCallback(const string& winname,     //图像视窗名称

MouseCallback onMouse,     //鼠标响应函数,监视到鼠标操作后调用并处理相应动作

void* userdata = 0       //鼠标响应处理函数的ID,识别号

);

OnMouseAction()响应函数

鼠标事件回调函数onMouse按照固定格式创建响应函数:

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

event事件代表了鼠标的各种操作,详细看一下各个event事件:

Event:

#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)坐标位置,即Point(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不放事件

函数指针 void *ustc标识了所响应的事件函数,相当于自定义了一个OnMouseAction()函数的ID。

简单应用:记录鼠标按下时坐标和鼠标抬起时坐标,分别做Line、Rectangle、Circle

#include "core/core.hpp"

#include "highgui/highgui.hpp"

#include "imgproc/imgproc.hpp"

#include

using namespace cv;

using namespace std;

void OnMouseAction(int event,int x,int y,int flags,void *ustc); //鼠标回调事件函数

int static times; //记录调用次数

int rowsBegin,rowsEnd;

int colsBegin,colsEnd;

Mat image;

int main(int argc,char*argv[])

{

image=imread(argv[1]);

imshow("image",image);

setMouseCallback("image",OnMouseAction);

}

//*******************************************************************//

//鼠标回调函数

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

{

if(event==CV_EVENT_MOUSEMOVE)

{

cout<

}

if(event==CV_EVENT_LBUTTONDOWN)

{

rowsBegin=y;

colsBegin=x;

cout<

}

if(event==CV_EVENT_LBUTTONUP)

{

rowsEnd=y;

colsEnd=x;

line(image,Point(colsBegin,rowsBegin),Point(colsEnd,rowsEnd),Scalar(255,0,0),2,8,0);

rectangle(image,Rect(colsBegin,rowsBegin,colsEnd-colsBegin,rowsEnd-rowsBegin),Scalar(0,255,0),2,8,0);

circle(image,Point((colsEnd+colsBegin)/2,(rowsEnd+rowsBegin)/2),rowsEnd-rowsBegin,Scalar(0,0,255),2,8,0);

imshow("image",image);

cout<

}

if(event==CV_EVENT_RBUTTONDOWN)

{

cout<

}

if(event==CV_EVENT_RBUTTONUP)

{

cout<

}

if(event==CV_EVENT_LBUTTONDBLCLK)

{

cout<

}

if(event==CV_EVENT_RBUTTONDBLCLK)

{

cout<

}

}

左键单击按下之后拖动鼠标到某一个位置之后松开:

DuiLib事件分析(一)——鼠标事件响应

最近在处理DuiLib中自定义列表行元素事件,因为处理方案得不到较好的效果,于是只好一层一层的去剥离DuiLib事件是怎么来的,看能否在某一层截取消息,自己重写. 我这里使用CListContaine ...

HTML5 精灵8方向移动&plus;背景滚动&plus;音效播放&plus;鼠标事件响应

如何清空画布 通过调用函数 ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);   如何实现背景滚动 首先我们准备了一张2532*940 ...

关于CMainFrm不接收鼠标事件响应原因

CMainFrm即主框架窗口对鼠标的左键和右键在OnLButtonDown中无响应 解决方案: 1.在OnNcLButtonDown中响应.(即非客户区中响应) 参考文献:http://www.cod ...

C语言控制台窗体图形界面编程(八):鼠标事件

上次讲的是键盘事件,这次我们介绍鼠标事件. 以下先介绍下鼠标事件的结构体以及相关信息. typedef struct _MOUSE_EVENT_RECORD //鼠标事件结构体 { CO ...

libevent源码分析一--io事件响应

这篇文章将分析libevent如何组织io事件,如何捕捉事件的发生并进行相应的响应.这里不会详细分析event与event_base的细节,仅描述io事件如何存储与如何响应. 1.  select l ...

Opencv下图像对鼠标事件的响应

直接上代码: // // 该程序从文件中读入一幅图像, ...

opencv鼠标事件

#include using namespace cv; struct mouse_para { cv::Mat org; cv::Mat img ...

Opencv处理鼠标事件-OpenCV步步精深

在图片上双击过的位置绘制一个 圆圈 鼠标事件就是和鼠标有关的,比如左键按下,左键松开,右键按下,右键松开,双击右键等等. 我们可以通过鼠标事件获得与鼠标对应的图片上的坐标.我们通过以下函数来调用查看所 ...

OpenGL 鼠标交互响应事件

OpenGL 鼠标.键盘交互响应事件 先来一个样例: uses gl,glu,glut; procedure InitEnvironment;cdecl; begin glClearColor();/ ...

随机推荐

2016&quot&semi;百度之星&quot&semi; - 资格赛(Astar Round1)

逆元 1001 Problem A 求前缀哈希和逆元 #include typedef long long ll; const int MOD = 9973 ...

BIEE使用技巧

索引: 1.如何清除缓存 2.通过“编辑 SQL”取得前一天的日期 3.格式化日历框参数 4.根据传入的开始时间和结束时间取得事实表中的指标(用到了3中的技巧) 5.直接调用数据库函数 6.时间格式转 ...

JAVA笔记 之 Thread线程

线程是一个程序的多个执行路径,执行调度的单位,依托于进程存在. 线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈,是在建立线程时由系统分配的,主要用来保存线程内部 ...

iOS之UI--关于modal

modal的效果展示: 关于modal的涉及到的知识点: 1.当一个控制器被销毁的时候,它里面所有子控制器的业务逻辑都不能够处理 2.当一个控制器被销毁的时候,它里面所有子控件的业务逻辑都不能够处理 ...

Codeforces 158E Phone Talks

http://codeforces.com/contest/158/problem/E 题目大意: 麦克是个名人每天都要接n电话,每通电话给出打来的时间和持续时间,麦克可以选择接或不接,但是只能不接k ...

ecshop 后台批量上传商品 完整上传

ecshop 后台批量上传商品,之所以无法上传,是因为后台上传php文件方法中没有导入商品原图路径 将ecshop根目录中的admin/goods_batch.php文件全部修改为 <?php ...

SQL STUFF函数 拼接字符串

今日看到一篇文章,是关于和并列的,也研究了下,还是不错的 要这种效果. create table tb(idint, value varchar(10)) insert into tbvalues(1 ...

如何让struts2和servlet的共存

如何让struts2和servlet的共存 (2013-08-29 14:07:49) 转载▼ 标签: servlet与struts2共存 同时配置struts2与ser servlet访问不到 分类 ...

MongoDB 3&period;0 WiredTiger Compression and Performance

MongoDB3.0中的压缩选项 在MongoDB 3.0中,WiredTiger为集合提供三个压缩选项: 无压缩 Snappy(默认启用) – 很不错的压缩,有效利用资源 zlib(类似gzip) ...

MySQL:MySQL Workbench的使用

MySQL Workbench 一.布局介绍 附:图片转自https://blog.csdn.net/qq_19891827/article/details/53995079 二.创建数据库 第一步: ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值