OpenCV基础:鼠标控制

在 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()

结果展示

在终端中打印鼠标事件类型、坐标、用户数据: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值