Python OpenCV鼠标交互操作详解:回调函数与参数传递

Felix
Felix
发布时间:2026-10-14 | 4人浏览过
原创

本文详细介绍Python OpenCV中实现鼠标交互操作的核心机制,重点解析cv2.setMouseCallback函数及其回调函数onMouse的参数定义。通过event、x、y、flags等参数说明如何捕捉鼠标事件与坐标,并演示如何通过param参数在回调函数与主程序间传递图像对象,实现十字线绘制等交互功能。

前言

在OpenCV中实现鼠标交互功能,主要依赖于两个关键函数的配合使用:

  • 首先是cv2.setMouseCallback(windowName, onMouse [, param]),用于注册窗口级别的鼠标事件监听。
  • 其次是作为回调函数参数的onMouse(event, x, y, flags, param),该函数定义具体的鼠标操作逻辑。

接下来将分别对这两个函数的具体用法进行说明,并通过一个简单示例展示其实际应用。

cv2.setMouseCallback(windowName, onMouse [, param])

该函数的参数说明如下:

  • windowName:必需参数。类似于cv.imshow()函数,OpenCV通过窗口名称来识别具体操作的目标窗口,这类似于窗口句柄的概念。
  • onMouse:必需参数。这是鼠标回调函数,其定义格式为onMouse(event, x, y, flags, param)。所有期望实现的鼠标操作逻辑均需在此函数内部编写。
  • param:可选参数。需要注意的是,onMouse函数内部也包含一个param参数,它与setMouseCallback中的param是同一个对象。简而言之,这个param是onMouse和setMouseCallback之间进行参数通信的接口。

鼠标回调函数:onMouse(event, x, y, flags, param)

该参数列表无需修改,除param外,其他参数均由回调函数自动获取值。

具体参数说明如下:

  • event:由回调函数根据鼠标对图像的操作自动获取,内容涵盖左键点击、左键弹起、右键点击等多种操作状态。
  • x,y:由回调函数自动获取,记录鼠标当前的坐标位置。坐标原点位于图像左上角(0, 0),x轴方向向右为正,y轴方向向下为正。
  • flags:记录一些专门的操作状态,具体说明见下文。
  • param:从setMouseCallback()传递过来的参数。由于该参数在setMouseCallback()处是可选的,因此可以不设置。

event和flags的种类:

可以使用如下代码获取event的种类:


# -*- coding: utf-8 -*-
import cv2
events = [i for i in dir(cv2) if 'EVENT' in i]
print(events)

结果分为两部分,下面以EVENT_FLAG_开头的是flags对应的状态,其它的是event对应的状态。 flags和event似乎不能同时起作用,也就是说,我们无法通过同时判断这两个条件来实现组合键操作。

[‘EVENT_FLAG_ALTKEY', ‘EVENT_FLAG_CTRLKEY', ‘EVENT_FLAG_LBUTTON', ‘EVENT_FLAG_MBUTTON', ‘EVENT_FLAG_RBUTTON', ‘EVENT_FLAG_SHIFTKEY', ‘EVENT_LBUTTONDBLCLK', ‘EVENT_LBUTTONDOWN', ‘EVENT_LBUTTONUP', ‘EVENT_MBUTTONDBLCLK', ‘EVENT_MBUTTONDOWN', ‘EVENT_MBUTTONUP', ‘EVENT_MOUSEHWHEEL', ‘EVENT_MOUSEMOVE', ‘EVENT_MOUSEWHEEL', ‘EVENT_RBUTTONDBLCLK', ‘EVENT_RBUTTONDOWN', ‘EVENT_RBUTTONUP']

示例

下面是一个简单的示例,运行程序后,我们可以通过鼠标左键单击来画一些十字线。


# -*- coding: utf-8 -*-

import cv2
import numpy as np

WIN_NAME = 'pick_points'


def onmouse_pick_points(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print('x = %d, y = %d' % (x, y))
        cv2.drawMarker(param, (x, y), (0, 255, 0))


if __name__ == '__main__':
    image = np.zeros((256, 256, 3), np.uint8)
    cv2.namedWindow(WIN_NAME, 0)
    cv2.setMouseCallback(WIN_NAME, onmouse_pick_points, image)
    while True:
        cv2.imshow(WIN_NAME, image)
        key = cv2.waitKey(30)
        if key == 27:  # ESC
            break
    cv2.destroyAllWindows()

上面程序中有几个注意点:

  • setMouseCallback()中的param参数我们传递了image进去,也就是说鼠标回调函数onmouse_pick_points()中的param就是image,画十字线的操作在鼠标回调函数中,该参数在onmouse_pick_points中的变化可以保留到函数外,可以理解为C++的引用传递,或C语言的指针传递。
  • 需要一个无限循环来刷新图像。
  • 无限循环的退出条件由键盘获取,cv2.waitKey()用来获取键盘的按键,当我们点ESC后就可以退出。

这里点了三次左键,终端输出以下内容:


x = 60, y = 55
x = 206, y = 113
x = 114, y = 192

并得到这样一张图像:

总结

到此这篇关于python opencv鼠标交互操作的文章就介绍到这了,更多相关python opencv鼠标交互操作内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表