虽然从大学开始接触程序好多年了,但依旧是个菜鸟。本来大学毕业以后准备从事软件开发相关的工作,一系列的机缘巧合跑到日本来继续读书了。刚好日本这边学的是数字图像处理。除了使用C语言以外,感觉其他东西都是和我的以前计算机专业八竿子打不着边。所以一切还是从零开始学起。

开始接触数字图像之前。导师给了我一本【C语言学习数字图像处理】这本书,书是日文的,花了2个月的时间啃完了感觉稍微了解了数字图像处理是怎么一回事,但入门都算不上。感觉光是本书上的东西什么做不出来,于是网上找了很多资料,多番权衡决定从opencv入手,把自己平时学到的东西写下来,和大家分享,与大家一同进步。有不足之处还请各位指正,毕竟当了这么多年的菜鸟已经,哈哈。废话就说这么多了。下面进入正题。

想要相应鼠标事件,首先需要对该事件进行注册,注册函数是

CVAPI(void) cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse,
                                void* param CV_DEFAULT(NULL));

第一个参数const char* window_name是事件作用的窗口名称,即该事件在那一个窗口起作用。

第二个参数CvMouseCallback on_mouse是回调函数的名称,即触发事件以后调用的函数。

第三个参数void* param CV_DEFAULT(NULL)是传递这个类的指针决定对那一个类产生影响。

相应事件后被调用的函数一般可写作:

void MyMouseCallback(int event, int x, int y, int flags, void* param);

第一个参数是响应事件的类型,例如点击鼠标左键等。第二三个参数返回响鼠标事件时光标在窗口的位置坐标。int flags则指定了事件发生时的不同状态。最后的参数param效果同cvSetMouseCallback()中的param。

现在我们想要在窗口中用鼠标绘制矩形,具体代码如下:

#include "stdio.h"
#include "highgui.h"
#include "cv.h"
CvRect box;  //用来保存需要绘制的矩形的状态
bool drawing_box=false;  
void MyMouseCallback(int event, int x, int y, int flags, void* param);
int main(int argc, char* argv[])  
{  
IplImage* img=cvLoadImage("1.jpg");//读入一张图片
box=cvRect(-1,-1,0,0);  //初始化矩形状态
cvNamedWindow("TestWindow",CV_WINDOW_FREERATIO);
cvSetMouseCallback("TestWindow",MyMouseCallback,img);//注册事件响应函数,回调函数定义在main函数下方
IplImage *temp=cvCloneImage(img);  //这里是为了在响应鼠标的move事件时,矩形会重复绘制,所以需要不断地对背景图片进行重绘显示。
while (1)
{
cvCopyImage(img,temp);  
if(drawing_box) cvRectangle(temp,cvPoint(box.x,box.y),cvPoint(box.x+box.width,box.y+box.height),cvScalar(0xff,0x00,0x00));
cvShowImage("TestWindow",temp);
if(cvWaitKey(15)==27) break;  
}
cvReleaseImage(&img); 
cvDestroyWindow("TestWindow");  
cvWaitKey();
return 0;
}  
void MyMouseCallback(int event, int x, int y, int flags, void* param)
{
IplImage *img=(IplImage *)param;  
switch (event)
{
case CV_EVENT_LBUTTONDOWN:{
drawing_box=true;
box=cvRect(x,y,0,0);
}
break;
case CV_EVENT_MOUSEMOVE:{
if(drawing_box)
box.width=x-box.x;
   box.height=y-box.y;
}
break;
case CV_EVENT_LBUTTONUP:{
drawing_box=false;
if(box.width<0){  
box.x+=box.width;  
box.width*=-1;  
}  
if(box.height<0)  
{  
box.y+=box.height;  
box.height*=-1;  
}  
cvRectangle(img,cvPoint(box.x,box.y),cvPoint(box.x+box.width,box.y+box.height),cvScalar(0xff,0x00,0x00));
}
break;
default:
break;
}
}

注意,一旦注册了响应事件的函数,整个程序在运行过程中是在不断地监听的,也就是说只要鼠标做出相应的事件就会去调用回调函数。

运行结果:

【opencv学习手账】1.鼠标相应事件相关推荐

  1. JAVA编程思想学习手账初整理

    redis: 缓存击穿:对于访问过期的key查询数据时,加锁,保证只有一个线程去底层获取数据,并返回结果缓存 缓存穿透:对于访问不存在的key时给出空结果并缓存,或引入布隆过滤器将数据提前缓存在布隆过 ...

  2. 检测单击鼠标左键并拖动的消息_计算机视觉OpenCV学习笔记(四):关于鼠标的相关事件函数...

    (7)把鼠标当画笔 本篇目标: 学会使用OpenCV中的鼠标处理的相关事件,事件回调函数怎么去定义,参数有哪些,以及如何注册鼠标监听事件. 7.1 .1 回调函数的定义: 1 def name(eve ...

  3. html鼠标响应事件吗,学习JavaScript鼠标响应事件

    本文为大家分享了一个简单的鼠标模拟案例,供大家参考,具体实现内容如下 如何实现捕抓鼠标事件,当鼠标滑动时,获取当前鼠标的坐标,接着在一个透明区域里绑定捕抓的位移,这样就能在模拟的透明区域里实现鼠标滑动 ...

  4. OpenCV中图像窗口的鼠标事件

    首先需要绑定图像窗口于一个鼠标事件处理函数 void cv::setMouseCallback (const String & winname, MouseCallback onMouse, ...

  5. python+webdriver学习鼠标键盘事件以及定位元素

    设置浏览器大小:像素点 set_window_size(width,height) maximize_window() 浏览器全屏显示,不带参数 控制浏览器前进.后退: driver.forward( ...

  6. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  7. openCV学习教程(一):Mat类的使用

    Opencv3-Study Opencv学习笔记(八) -- 图像色彩空间转换 yuv422转opencv mat显示 OpenCv2 学习笔记(1) Mat创建.复制.释放 OpenCv学习笔记(二 ...

  8. OpenCV学习笔记(九): 漫水填充:floodFill()

    OpenCV学习笔记(九): 漫水填充:floodFill() 定义: 漫水填充法是一种用特定的颜色填充联通区域(自动选中了和种子点相连的区域,接着将该区域替换成指定的颜色)通过设置可连通像素的上下限 ...

  9. opencv学习笔记01

    原创博文地址:opencv学习笔记01 学习目标 1,opencv能做什么,不能做什么 2,阅读代码,知道某种func后图片怎么样了 3,在图片相关机器学习算法预处理阶段,希望通过对图片的简单处理,达 ...

最新文章

  1. 人工智能,人脸识别门禁下的校园考勤
  2. React开发(256):react项目理解 ant design 注意报错提示
  3. JAVA自学笔记08
  4. 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。
  5. 怎样用JS来添加CSS样式
  6. MongoDB小结26 - 地理空间索引
  7. UI漂亮音乐分享网站源码
  8. sam机架和kx连线图_独立声卡 kx DSP连线图详细教程(SAM机架使用的DSP连线图)
  9. mdb access2000 中文密码破解
  10. SQLMap——Tamper学习
  11. (视频) 《快速创建网站》3.4 网站改版3分钟搞定 - WordPress主题安装和备份
  12. 《元宇宙十大技术》感谢乔卫兵等6位为出版做出巨大贡献
  13. 中国Linux公社校园联络员第四次全体大会会议记录
  14. java sorted 方法_多个.sorted(…)调用java 8流
  15. #NAME?_#NAME?:EXCEL表中出现#NAME是什么意思?
  16. 融合DE 端和FE端数据,利用小波变换生成时频图,再分别利用DCNN、KNN和DNN进行对比实验(python代码)
  17. unity shader 边缘光,内发光,外发光,轮廓边缘光,轮廓内边缘光,轮廓外边缘光
  18. auto.js Pro编写的QQ跳码注册陌陌稳定版脚本源代码,免root运行
  19. 独角兽项目 1 - 替罪羊
  20. 青龙新毛——闪电世界

热门文章

  1. 赫斯曼三层交换机组建车身车间虚拟局域网
  2. Git中Your branch is ahead of ‘origin/master‘ by x commits的解决办法
  3. css实现div阴影效果
  4. android自动登录简书,安卓实现用户登录界面
  5. ETH2.0将开启超级牛市,BitOffer以太坊ETF基金涨幅超10倍
  6. 分享 | 如何在不同工艺间进行设计的移植转换
  7. 怎么用matlab绘制半径为2的球面,绘制下列三维图形。 (2) (4)半径为10的球面 (10.0分)...
  8. 【系】微信小程序云开发实战坚果商城-前端之订单实现
  9. 【英语:基础进阶_语法进阶提升】F1.英文时态进阶
  10. 电脑象棋开发-vc界面图形绘制