【基础】鼠标交互

当用户触发鼠标事件时,我们希望对该事件做出响应。例如,单击鼠标就画一个圆。通常的做法是,创建一个OnMouseAction()响应函数,将要实现的操作写在该响应函数内。响应函数是按照固定的格式创建的,其格式为:

def OnMouseAction(event, x, y, flags, param):

● event表示触发了何种事件

image.png

● x, y代表触发鼠标事件时,鼠标在窗口中的坐标(x, y)。

● flags代表鼠标的拖曳事件,以及键盘鼠标联合事件,详细如下表所示

image.png

● param为函数ID,标识所响应的事件函数,相当于自定义一个OnMouseAction()函数的ID。

● OnMouseAction为响应函数的名称,该名称可以自定义。

定义响应函数以后,要将该函数与一个特定的窗口建立联系(绑定),让该窗口内的鼠标触发事件时,能够找到该响应函数并执行。要将函数与窗口绑定,可以通过函数cv2.setMouseCallback()实现,其基本语法格式是:

cv2.setMouseCallback(winname, onMouse)

● winname为绑定的窗口名。

● onMouse为绑定的响应函数名。

程序演示

一.设计一个程序,对触发的鼠标事件进行判断。

import cv2
import numpy as np


def demo(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print('检测到鼠标左键单击')
    elif event == cv2.EVENT_RBUTTONDOWN:
        print('检测到鼠标右键单击')
    elif event == cv2.EVENT_MBUTTONDOWN:
        print('检测到单击了鼠标中间键')


img = np.ones((300, 300, 3), np.uint8) * 255

# 创建图像与窗口,并将窗口与回调函数绑定
cv2.namedWindow('image')
cv2.setMouseCallback('image', demo)

cv2.imshow('image', img)
cv2.waitKey()
cv2.destroyAllWindows()

运行程序,在创建的窗口image内:

● 单击鼠标左键,会触发单击左键事件“cv2.EVENT_LBUTTONDOWN”。

● 单击鼠标右键,会触发单击右键事件“cv2.EVENT_RBUTTONDOWN”。

● 单击鼠标中间键(滚轮),会触发单击中间键事件“cv2.EVENT_MBUTTONDOWN”。

运行上述程序,先后单击左键,右键,鼠标中间键,结果如下所示:

image.png

一.设计一个程序,实现双击左键画圆圈。

import cv2

img = cv2.imread('windows.png')  # 读取图片作为背景

# 定义画圆事件,双击左键时触发
def draw_circle(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDBLCLK:  # 左键双击事件
        cv2.circle(img, (x, y), 50, (0, 0, 255), 2)


# 创建图像与窗口并将窗口与回调函数绑定
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)

while True:
    cv2.imshow('image', img)
    if cv2.waitKey(100) == ord('q'):  # 等待100毫秒 刷新一次显示图像
        break

cv2.destroyAllWindows()

在对窗口的四处随机地点进行双击后,其运行如下图所示

image.png