跳转至

鼠标事件监听

概要

本文讲解了如何使用HighGUI进行鼠标事件监听,介绍了都有哪些鼠标事件及其用法。

keywords Mouse 鼠标 HighGUI 鼠标事件监听

20180126mouse.png

鼠标事件分类

大家想一想鼠标都可以有哪些事件?

其实我们可以用脚本的方式,查看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)

文章推荐

项目实战-绘图板