在 OpenCV 中,setMouseCallback 是一个用于设置鼠标事件回调函数的接口。当你希望在显示的图像窗口中捕捉用户的鼠标操作(如点击、移动、按下或释放)时,这个接口非常有用。它允许你通过一个回调函数来处理用户的鼠标事件,从而进行交互式图像处理。
setMouseCallback 的作用
setMouseCallback 用于在指定的窗口上设置一个鼠标事件的回调函数。当用户在这个窗口内进行鼠标操作时,回调函数会被触发,并且可以获取关于鼠标事件的详细信息。
参数说明
cv2.setMouseCallback(windowName, mouse_cb, param=None)
参数:
- windowName (str):指定事件触发的窗口名称,必须是通过 cv2.namedWindow 创建的窗口。
- mouse_cb (function):回调函数,当鼠标事件发生时,该函数会被调用。
回调函数:
def mouse_cb(event, x, y, flags, userdata):
print(event, x, y, flags, userdata)
- event:鼠标事件类型(例如鼠标按下、移动等)。
- x, y:鼠标事件发生时的坐标(相对于窗口左上角)。
- flags:标志,用于指示鼠标的额外状态(如按键是否按下)。
- userdata:附加参数,可以是任何类型的数据,通常用于传递额外信息。
以下是 setMouseCallback 中 event 参数的所有常见鼠标事件类型的说明:
事件类型 | 说明 | 数值 |
---|---|---|
cv2.EVENT_LBUTTONDOWN | 左键按下 | 1 |
cv2.EVENT_LBUTTONUP | 左键释放 | 4 |
cv2.EVENT_RBUTTONDOWN | 右键按下 | 2 |
cv2.EVENT_RBUTTONUP | 右键释放 | 5 |
cv2.EVENT_MBUTTONDOWN | 中键按下 | 16 |
cv2.EVENT_MBUTTONUP | 中键释放 | 17 |
cv2.EVENT_MOUSEMOVE | 鼠标移动 | 0 |
cv2.EVENT_MOUSEWHEEL | 鼠标滚轮 | 8 |
cv2.EVENT_FLAG_LBUTTON | 左键按下的标志位 | 32 |
cv2.EVENT_FLAG_RBUTTON | 右键按下的标志位 | 64 |
cv2.EVENT_FLAG_MBUTTON | 中键按下的标志位 | 128 |
cv2.EVENT_FLAG_CTRLKEY | 按下 Ctrl 键的标志位 | 8 |
cv2.EVENT_FLAG_SHIFTKEY | 按下 Shift 键的标志位 | 16 |
cv2.EVENT_FLAG_ALTKEY | 按下 Alt 键的标志位 | 32 |
解释
- EVENT_LBUTTONDOWN、EVENT_RBUTTONDOWN 和 EVENT_MBUTTONDOWN 分别对应鼠标左键、右键和中键按下的事件。
- EVENT_LBUTTONUP、EVENT_RBUTTONUP 和 EVENT_MBUTTONUP 分别对应鼠标左键、右键和中键释放的事件。
- EVENT_MOUSEMOVE 发生在鼠标指针移动时。
- EVENT_MOUSEWHEEL 用于检测鼠标滚轮的事件。
- EVENT_FLAG_LBUTTON、EVENT_FLAG_RBUTTON 和 EVENT_FLAG_MBUTTON 是用于检测鼠标按键的额外标志位,这些常常用于结合其他事件类型一起使用。
- EVENT_FLAG_CTRLKEY、EVENT_FLAG_SHIFTKEY 和 EVENT_FLAG_ALTKEY 是标志位,用于判断是否按下了 Ctrl、Shift 或 Alt 键。
注意
- 事件数值(如 1、2、16 等)是 OpenCV 中定义的常量,用于区分不同类型的鼠标事件。
- 事件类型和标志位可以组合使用,在 flags 参数中传递。例如,如果同时按下左键和 Shift 键,flags 会包含 EVENT_FLAG_LBUTTON 和 EVENT_FLAG_SHIFTKEY。
代码
以下代码的作用是设置鼠标事件回调,打印出事件、坐标等信息。
import cv2
import numpy
def mouse_cb(event, x, y, flags, userdata):
print(event, x, y, flags, userdata)
#创建窗口
cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 480)
#设置鼠标回调函数
cv2.setMouseCallback('mouse', mouse_cb, 666)
#显示窗口和背景
img = numpy.zeros((360,640,3), numpy.uint8)
while True:
cv2.imshow('mouse', img)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break;
cv2.destroyAllWindows()
结果展示
在终端中打印鼠标事件类型、坐标、用户数据: