【基础】鼠标交互
当用户触发鼠标事件时,我们希望对该事件做出响应。例如,单击鼠标就画一个圆。通常的做法是,创建一个OnMouseAction()响应函数,将要实现的操作写在该响应函数内。响应函数是按照固定的格式创建的,其格式为:
def OnMouseAction(event, x, y, flags, param):
● event表示触发了何种事件

● x, y代表触发鼠标事件时,鼠标在窗口中的坐标(x, y)。
● flags代表鼠标的拖曳事件,以及键盘鼠标联合事件,详细如下表所示

● 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”。
运行上述程序,先后单击左键,右键,鼠标中间键,结果如下所示:

一.设计一个程序,实现双击左键画圆圈。
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()
在对窗口的四处随机地点进行双击后,其运行如下图所示
