OpenCV 鼠标回调函数 【setMouseCallback】超详细用法教程
OpenCV 鼠标回调函数setMouseCallback超详细用法教程这是 OpenCV 实现交互式图像处理的核心功能,能让你通过鼠标点击、拖拽、滚轮等操作,在窗口上实现画框、取色、裁剪等交互逻辑。一、核心函数全解析1.cv2.setMouseCallback():绑定鼠标事件到窗口作用:为指定的 OpenCV 窗口绑定一个鼠标回调函数,当窗口上发生鼠标操作时,自动触发该函数。完整语法cv2.setMouseCallback(winname,onMouse,userdata=None)参数说明参数说明winname要绑定的窗口名称(必须和namedWindow/imshow的窗口名完全一致)onMouse鼠标回调函数(自定义的函数,格式固定)userdata可选,传递给回调函数的自定义数据(比如图像、参数等)2. 回调函数onMouse:处理鼠标事件的核心作用:当窗口上发生鼠标操作时,OpenCV 会自动调用这个函数,并传入事件信息。固定语法(必须严格遵守格式)defonMouse(event,x,y,flags,userdata):# 在这里写你的鼠标事件处理逻辑pass参数说明(每个参数的含义必须记牢)参数说明event鼠标事件类型(比如左键点击、右键按下、移动等,OpenCV 预定义了常量)x, y鼠标触发事件时,在窗口图像上的像素坐标(左上角为 (0,0))flags鼠标按键/修饰键的状态(比如 Ctrl+点击、Shift+拖拽等)userdatasetMouseCallback传入的自定义数据二、所有鼠标事件event常量对照表OpenCV 预定义了所有鼠标事件,直接用常量名即可,不用记数字:事件常量数字值触发场景cv2.EVENT_MOUSEMOVE0鼠标在窗口内移动cv2.EVENT_LBUTTONDOWN1鼠标左键按下cv2.EVENT_RBUTTONDOWN2鼠标右键按下cv2.EVENT_MBUTTONDOWN3鼠标中键按下cv2.EVENT_LBUTTONUP4鼠标左键松开cv2.EVENT_RBUTTONUP5鼠标右键松开cv2.EVENT_MBUTTONUP6鼠标中键松开cv2.EVENT_LBUTTONDBLCLK7鼠标左键双击cv2.EVENT_RBUTTONDBLCLK8鼠标右键双击cv2.EVENT_MBUTTONDBLCLK9鼠标中键双击cv2.EVENT_MOUSEWHEEL10鼠标滚轮滚动(正数=向前,负数=向后)三、flags修饰键状态说明flags用于判断按键组合,比如按住 Ctrl 再点击鼠标,常用组合:flags 常量说明cv2.EVENT_FLAG_LBUTTON左键处于按下状态cv2.EVENT_FLAG_RBUTTON右键处于按下状态cv2.EVENT_FLAG_MBUTTON中键处于按下状态cv2.EVENT_FLAG_CTRLKEYCtrl 键被按下cv2.EVENT_FLAG_SHIFTKEYShift 键被按下cv2.EVENT_FLAG_ALTKEYAlt 键被按下判断方式:用flags 常量来检测,比如:ifflagscv2.EVENT_FLAG_CTRLKEY:print("Ctrl 键被按下")四、实战:3个高频场景完整代码场景1:基础演示——点击鼠标打印坐标、取色实现功能:左键点击:打印坐标 + 该点的 BGR 颜色值右键点击:打印坐标 + 该点的灰度值鼠标移动:实时打印坐标importcv2importnumpyasnp# 全局变量:存储当前图像img=cv2.imread("test.jpg")# 替换为你的图片路径# 鼠标回调函数defmouse_callback(event,x,y,flags,userdata):# 左键点击:打印坐标和BGR颜色ifevent==cv2.EVENT_LBUTTONDOWN:b,g,r=img[y,x]# 注意:图像是[y,x],不是[x,y]!print(f"左键点击:坐标({x},{y}),BGR值({b},{g},{r}),RGB值({r},{g},{b}