【opencv系列05】OpenCV4.X鼠标回调函数
点击上方“AI搞事情”关注我们
一、回调函数
setMouseCallback(windowName, onMouse, param=None)
windowName
:窗口名称
onMouse
:鼠标响应处理函数
鼠标回调函数,该函数在鼠标事件发生时被调用。鼠标事件可以是与鼠标相关的任何操作,如左键向下,左键向上,左键双击等。它为我们提供了每个鼠标事件的坐标(x,y)。 通过这个事件和位置,我们可以做任何我们想做的事情。 通过以下代码,可以列出所有的鼠标事件。
「代码」
import cv2
events = [i for i in dir(cv2) if 'EVENT' in i]
print( events )
「输出」
['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON',
'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY',
'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK',
'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE',
'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']
参数 含义
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 中间双击
二、应用
1. 应用一
创建了一个简单的应用程序,只要我们双击它就可以在图像上绘制一个圆圈。
「代码」
import numpy as np
import cv2# mouse callback function
def draw_circle(event, x, y, flags, param):if event == cv2.EVENT_LBUTTONDBLCLK:cv2.circle(img, (x, y), 100, (255, 0, 0), -1)# Create a black image, a window and bind the function to window
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)while True:cv2.imshow('image', img)if cv2.waitKey(20) & 0xFF == 27:break
cv2.destroyAllWindows()
2. 应用二
通过拖动鼠标绘制矩形或圆形(根据我们选择的模式),就像在绘图应用程序中一样。 所以我们的鼠标回调函数有两个部分,一个用于绘制矩形,另一个用于绘制圆形。在主循环中,设置键'm'设置键盘绑定进行矩形和圆之间切换。
「代码」
import numpy as np
import cv2drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1# mouse callback function
import numpy as np
import cv2drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1# mouse callback function
def draw_circle(event,x,y,flags,param):global ix,iy,drawing,modeif event == cv2.EVENT_LBUTTONDOWN:drawing = Trueix,iy = x,yelif event == cv2.EVENT_MOUSEMOVE:if drawing == True:if mode == True:cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)else:cv2.circle(img,(x,y),5,(0,0,255),-1)elif event == cv2.EVENT_LBUTTONUP:drawing = Falseif mode == True:cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)else:cv2.circle(img,(x,y),5,(0,0,255),-1)img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)while True:cv2.imshow('image',img)k = cv2.waitKey(1) & 0xFFif k == ord('m'):mode = not modeelif k == 27:breakcv2.destroyAllWindows()
长按二维码关注我们
有趣的灵魂在等你
【opencv系列05】OpenCV4.X鼠标回调函数相关推荐
- Python Opencv 实现鼠标事件(包含一个练习)——事件触发讲解·以及鼠标回调函数的实现
文章目录 鼠标事件概述 鼠标事件发生的结构 鼠标回调函数的标准格式 opencv下包含的所有事件--包含flag和event(可以看一下,熟悉常见事件范围) 鼠标事件的实现函数 一个完整的鼠标事件由一 ...
- Opencv鼠标回调函数
1.目的 读取一张图片,在该图片上截取一个ROI区域,将截取的图像在新窗口显示,并可以保存至工程目录下. 2.实现环境 C++.VS2017.opencv 3.回调函数原理 回调函数就是一个通过函数指 ...
- ROS开发系列(7)- 在回调函数中发布topic
文章目录 1 实现方法 2 实现代码 3 运行结果 参考 1 实现方法 在ROS开发系列(6)- zed深度信息与datknet的boundingbox信息融合基础上进行的修改. 创建一个自定义消息类 ...
- 【opencv系列08】OpenCV4.X图像融合操作
点击上方"AI搞事情"关注我们 图像叠加 add(src1, src2, dst=None, mask=None, dtype=None)函数或者numpy操作实现图像按位相加,若 ...
- 【opencv系列07】OpenCV4.X图像基本操作
点击上方"AI搞事情"关注我们 一.像素操作 可以通过行列坐标访问像素值,对于BGR图,返回一个蓝色.绿色.红色通道的数组值,对于灰度图,仅返回相应的强度值. 代码 import ...
- OPENCV回调函数
OPENCV回调函数 回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该 ...
- 【学习OpenCV4】在OpenCV中响应键盘与鼠标操作
键盘与鼠标的响应 一.键盘的响应 1.1 基本知识 1.2 确定按键响应值 1.3 按键调节亮度 二.鼠标的响应 1.1 基本知识 1.2 示例程序 一.键盘的响应 1.1 基本知识 按键的读取只 ...
- python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框
最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视 ...
- opencv画框显示python_python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框...
最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视 ...
最新文章
- BJUI使用ajax异步表单提交时后台action要加@ResponseBody
- python正则表达匹配汉字
- 回文数的个数、杨辉三角
- fedora 不在sudoers文件中_COPR 仓库中 4 个很酷的新软件(2019.4) | Linux 中国
- 细学PHP 14 mysql-4
- mysql数据库作业_mysql数据库操作练习
- 20春计算机应用基础在线作业,19春学期《计算机应用基础》在线作业21.txt
- 《简明 Python 教程》笔记-----面向对象及系统相关
- Mac快速备忘录开启与关闭设置方法
- 130242014029-黄超强-实验一
- python实现逻辑回归牛顿法求参数_教程 | 如何通过牛顿法解决Logistic回归问题
- plsql下载安装及基本使用
- Beyond Compare 过期解决办法
- 安装Pure-ftpd
- day21、3 - 防火墙HA
- 微信小程序识别字符串中的手机号,手机号高亮显示,并且可以点击这个手机号,拨打电话?
- 太离谱了!一行Python代码写的游戏,我能这样玩一天!
- spring data jpa 与 jpa的区别
- linux文件权限的例子,Linux基础教程之linux文件权限深度解读
- MySQL 查询排名
热门文章
- mac安装nvm及换源及node安装切换
- gethostbyname()函数:通过域名获取IP地址
- 十年的老代码,你敢动?
- pythonsubprocess执行多条shell命令_python中subprocess批量执行linux命令
- 排队问题解题思路_高考文科数学是最“拉分”的!6种题型分析与10大解题方法...
- php文件在桌面删除不了图片吗,删除windows桌面上某个应用程序的图标,意味着什么...
- Python学习系列day1-python基础
- 汇编解析(2)-内存寻址之实模型平面模式(real mode flat mode)(2)
- 【时间序列】使用 Auto-TS 自动化时间序列预测
- 【数据竞赛】大规模数据调参用这个包就可以啦。