鼠标事件监听¶
概要¶
本文讲解了如何使用HighGUI进行鼠标事件监听,介绍了都有哪些鼠标事件及其用法。
keywords Mouse 鼠标 HighGUI 鼠标事件监听
鼠标事件分类¶
大家想一想鼠标都可以有哪些事件?
其实我们可以用脚本的方式,查看cv2
所有以EVENT
开头的预定义变量的名称列表
''' 查看cv2都支持哪些事件 ''' import cv2 events=[i for i in dir(cv2) if 'EVENT'in i] for event in events: print(event)
快去试一试吧。
鼠标事件列表(event list)
-
EVENT_MOUSEMOVE
鼠标移动 Mouse Move -
EVENT_LBUTTONDOWN
鼠标左键点击 Left Button Down -
EVENT_RBUTTONDOWN
鼠标右键点击 Right Button Down -
EVENT_MBUTTONDOWN
鼠标中键点击 Middle Button Down -
EVENT_LBUTTONUP
鼠标左键抬起 Left Button Up -
EVENT_RBUTTONUP
鼠标右键抬起 Right Button Up -
EVENT_MBUTTONUP
鼠标中键抬起 Middle Button Up -
EVENT_LBUTTONDBLCLK
鼠标左键双击 Left Button Double Click -
EVENT_RBUTTONDBLCLK
鼠标右键双击 Right Button Double Click -
EVENT_MBUTTONDBLCLK
鼠标中键双击 Middle Button Double Click
鼠标事件的回调参数¶
鼠标事件举例:
def onMouse(event,x,y,flags,param): # 判断事件是否为 Left Button Double Clicck if event == cv2.EVENT_LBUTTONDBLCLK: # 判断事件类型 执行相关操作 do_something()
-
event
鼠标事件类型, 如上文所述EVENT_MOUSEMOVE
等。 -
x
鼠标当前在窗口Windows下的x坐标 -
y
鼠标在当前窗口Windows下的y坐标 -
flags
鼠标事件发生过程值中的一些其他事件标志/状态 -
EVENT_FLAG_LBUTTON
左键正在按下 -
EVENT_FLAG_RBUTTON
右键正在被按下 -
EVENT_FLAG_MBUTTON
中键正在被按下 -
EVENT_FLAG_CTRLKEY
CTRL键正在被按下 -
EVENT_FLAG_SHIFTKEY
SHIFT键正在被按下 -
EVENT_FLAG_ALTKEY
ALT键正在被按下 -
param
用户自定义的参数
简单一些的例子, 例如, 我们判断鼠标左键是否被按下, 如果按下的话就绘制一个圆圈。
def draw_circle(event,x,y,flags,param): # 判断事件是否为 Left Button Double Clicck if event == cv2.EVENT_LBUTTONDBLCLK: cv2.circle(img,(x,y),20,(255,0,0),-1)
更复杂一些的判断方法, 是结合flags
我们起始可以在很多函数的参数看到flags 这类语句。 使用方法跟我们在CH2.2里讲解的namedWindow
函数类似。
例如我们想判断, 当前左键跟ALT键是不是处于同时被按下的状态, 我们可以这么写:
def onMouse(event,x,y,flags,param): if flags == ( cv2.EVENT_FLAG_LBUTTON | cv2.EVENT_FLAG_ALTKEY): # 判断事件类型 执行相关操作 do_something()
你也可以使用+
运算, 两者的效果是相同的, 详情,还是要看我在HighGUI窗口 章节里的介绍啊。二进制位表示状态。
def onMouse(event,x,y,flags,param): if flags == ( cv2.EVENT_FLAG_LBUTTON + cv2.EVENT_FLAG_ALTKEY): # 判断事件类型 执行相关操作 do_something()
我们也可以结合两者。做一个复杂的状态检测。 CTRL + 鼠标左键, 移动鼠标,绘制一个系列圆圈。
# CTRL + 鼠标左键, 移动鼠标,绘制一个系列圆圈 def onMouse(event,x,y,flags,param): # 判断事件是否为 Left Button Double Clicck print(flags) print(cv2.EVENT_FLAG_LBUTTON | cv2.EVENT_FLAG_CTRLKEY) if event == cv2.EVENT_MOUSEMOVE and flags == (cv2.EVENT_FLAG_LBUTTON | cv2.EVENT_FLAG_CTRLKEY ): cv2.circle(img,(x,y),20,(255,0,0),-1)