【opencv学习手账】1.鼠标相应事件
虽然从大学开始接触程序好多年了,但依旧是个菜鸟。本来大学毕业以后准备从事软件开发相关的工作,一系列的机缘巧合跑到日本来继续读书了。刚好日本这边学的是数字图像处理。除了使用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.鼠标相应事件相关推荐
- JAVA编程思想学习手账初整理
redis: 缓存击穿:对于访问过期的key查询数据时,加锁,保证只有一个线程去底层获取数据,并返回结果缓存 缓存穿透:对于访问不存在的key时给出空结果并缓存,或引入布隆过滤器将数据提前缓存在布隆过 ...
- 检测单击鼠标左键并拖动的消息_计算机视觉OpenCV学习笔记(四):关于鼠标的相关事件函数...
(7)把鼠标当画笔 本篇目标: 学会使用OpenCV中的鼠标处理的相关事件,事件回调函数怎么去定义,参数有哪些,以及如何注册鼠标监听事件. 7.1 .1 回调函数的定义: 1 def name(eve ...
- html鼠标响应事件吗,学习JavaScript鼠标响应事件
本文为大家分享了一个简单的鼠标模拟案例,供大家参考,具体实现内容如下 如何实现捕抓鼠标事件,当鼠标滑动时,获取当前鼠标的坐标,接着在一个透明区域里绑定捕抓的位移,这样就能在模拟的透明区域里实现鼠标滑动 ...
- OpenCV中图像窗口的鼠标事件
首先需要绑定图像窗口于一个鼠标事件处理函数 void cv::setMouseCallback (const String & winname, MouseCallback onMouse, ...
- python+webdriver学习鼠标键盘事件以及定位元素
设置浏览器大小:像素点 set_window_size(width,height) maximize_window() 浏览器全屏显示,不带参数 控制浏览器前进.后退: driver.forward( ...
- OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己
OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...
- openCV学习教程(一):Mat类的使用
Opencv3-Study Opencv学习笔记(八) -- 图像色彩空间转换 yuv422转opencv mat显示 OpenCv2 学习笔记(1) Mat创建.复制.释放 OpenCv学习笔记(二 ...
- OpenCV学习笔记(九): 漫水填充:floodFill()
OpenCV学习笔记(九): 漫水填充:floodFill() 定义: 漫水填充法是一种用特定的颜色填充联通区域(自动选中了和种子点相连的区域,接着将该区域替换成指定的颜色)通过设置可连通像素的上下限 ...
- opencv学习笔记01
原创博文地址:opencv学习笔记01 学习目标 1,opencv能做什么,不能做什么 2,阅读代码,知道某种func后图片怎么样了 3,在图片相关机器学习算法预处理阶段,希望通过对图片的简单处理,达 ...
最新文章
- 人工智能,人脸识别门禁下的校园考勤
- React开发(256):react项目理解 ant design 注意报错提示
- JAVA自学笔记08
- 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。
- 怎样用JS来添加CSS样式
- MongoDB小结26 - 地理空间索引
- UI漂亮音乐分享网站源码
- sam机架和kx连线图_独立声卡 kx DSP连线图详细教程(SAM机架使用的DSP连线图)
- mdb access2000 中文密码破解
- SQLMap——Tamper学习
- (视频) 《快速创建网站》3.4 网站改版3分钟搞定 - WordPress主题安装和备份
- 《元宇宙十大技术》感谢乔卫兵等6位为出版做出巨大贡献
- 中国Linux公社校园联络员第四次全体大会会议记录
- java sorted 方法_多个.sorted(…)调用java 8流
- #NAME?_#NAME?:EXCEL表中出现#NAME是什么意思?
- 融合DE 端和FE端数据,利用小波变换生成时频图,再分别利用DCNN、KNN和DNN进行对比实验(python代码)
- unity shader 边缘光,内发光,外发光,轮廓边缘光,轮廓内边缘光,轮廓外边缘光
- auto.js Pro编写的QQ跳码注册陌陌稳定版脚本源代码,免root运行
- 独角兽项目 1 - 替罪羊
- 青龙新毛——闪电世界
热门文章
- 赫斯曼三层交换机组建车身车间虚拟局域网
- Git中Your branch is ahead of ‘origin/master‘ by x commits的解决办法
- css实现div阴影效果
- android自动登录简书,安卓实现用户登录界面
- ETH2.0将开启超级牛市,BitOffer以太坊ETF基金涨幅超10倍
- 分享 | 如何在不同工艺间进行设计的移植转换
- 怎么用matlab绘制半径为2的球面,绘制下列三维图形。 (2) (4)半径为10的球面 (10.0分)...
- 【系】微信小程序云开发实战坚果商城-前端之订单实现
- 【英语:基础进阶_语法进阶提升】F1.英文时态进阶
- 电脑象棋开发-vc界面图形绘制