Opencv中的鼠标控制和TrackBar控件

一、鼠标控制

示例代码:

python 复制代码
import cv2
import numpy as np

def mouse_callback(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_callback, "123")

img = np.zeros((480, 640, 3), np.uint8)

while True:
    cv2.imshow('mouse', img)
    key = cv2.waitKey(1)
    if key & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

核心 API 及参数详解

这段代码中与鼠标回调相关的核心 API 有 2 个:cv2.setMouseCallback()(绑定回调函数)、自定义鼠标回调函数(处理鼠标事件),以下是各 API 的参数拆解:

1. 自定义鼠标回调函数(必须遵循 OpenCV 规范)

代码中定义的 mouse_callback(event, x, y, flags, userdata) 是 OpenCV 规定的鼠标回调函数格式,参数顺序和类型不可随意修改,具体说明:

参数名 类型 含义及常用取值
event 整数 鼠标事件类型(OpenCV 预定义常量),表示触发的具体操作: - cv2.EVENT_MOUSEMOVE(0):鼠标移动 - cv2.EVENT_LBUTTONDOWN(1):左键按下 - cv2.EVENT_LBUTTONUP(4):左键释放 - cv2.EVENT_RBUTTONDOWN(2):右键按下 - cv2.EVENT_RBUTTONUP(5):右键释放
x/y 整数 事件发生时鼠标在窗口内的坐标:x是水平坐标(从左到右),y是垂直坐标(从上到下)
flags 整数 鼠标事件的辅助标志(附加状态): - cv2.EVENT_FLAG_LBUTTON(1):左键按住 - cv2.EVENT_FLAG_SHIFTKEY(16):Shift 键按住 - cv2.EVENT_FLAG_CTRLKEY(8):Ctrl 键按住
userdata 任意类型 用户自定义数据,由cv2.setMouseCallback传递过来(代码中传的是字符串 "123")
2. cv2.setMouseCallback()(绑定鼠标回调到窗口)

这是关联窗口和回调函数的核心 API,函数格式:cv2.setMouseCallback(winname, onMouse, userdata=None)

参数名 类型 含义
winname 字符串 要绑定回调的窗口名称(必须和cv2.namedWindow创建的窗口名一致,代码中是 "mouse")
onMouse 函数对象 自定义的鼠标回调函数(代码中是mouse_callback),必须符合上述参数规范
userdata 任意类型(可选) 传递给回调函数最后一个参数的自定义数据(代码中传了 "123",默认 None)

总结

  1. 鼠标回调函数的参数必须严格遵循「event, x, y, flags, userdata」的顺序,前 4 个由 OpenCV 自动传入,最后 1 个是用户自定义数据;
  2. cv2.setMouseCallback的核心是绑定「窗口名」和「回调函数」,窗口名必须和创建的窗口一致;
  3. event表示鼠标的核心操作(按下 / 释放 / 移动),flags表示操作时的附加状态(按住快捷键等),两者结合可实现复杂鼠标交互。

二、TrackBar控件

示例代码:

python 复制代码
import cv2
import numpy

def callback():
    pass

#创建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar', 640, 480)

#创建trackbar
cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, callback)

#创建一个全黑的背景图片
img = numpy.zeros((480, 640, 3), numpy.uint8)

while True:
    r = cv2.getTrackbarPos('R', "trackbar")
    g = cv2.getTrackbarPos('G', "trackbar")
    b = cv2.getTrackbarPos('B', "trackbar")
    #改变背景图片颜色
    img[:] = [b, g, r]
    cv2.imshow('trackbar', img)

    key = cv2.waitKey(1)
    if key & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

核心 API 及参数详解

这段代码中与 TrackBar 控件相关的核心 API 有 2 个(cv2.createTrackbar()cv2.getTrackbarPos()),以下是各 API 的参数拆解:

1. cv2.createTrackbar ()(创建 TrackBar 控件)

这是创建轨迹条的核心 API,轨迹条无法独立存在,必须依附于已创建的 OpenCV 窗口。

函数格式

python 复制代码
cv2.createTrackbar(trackbarname, winname, value, count, onChange)

参数说明(表格形式更适合博客排版):

参数名 类型 含义及代码中的实际应用
trackbarname 字符串 轨迹条的唯一标识名称(用于后续获取值时识别):代码中分别为 "R"、"G"、"B",对应 RGB 三个颜色通道
winname 字符串 轨迹条依附的窗口名称(必须和cv2.namedWindow创建的窗口名一致):代码中为 "trackbar"
value 整数 轨迹条的初始值:代码中三个轨迹条初始值都设为 0(对应颜色初始亮度为 0,背景为黑色)
count 整数 轨迹条的最大值(最小值固定为 0):代码中设为 255(匹配 RGB 颜色通道 0-255 的取值范围)
onChange 函数对象 轨迹条数值变化时触发的回调函数:代码中传入空函数callback()(表示数值变化时不执行任何操作);若需自定义逻辑,回调函数需接收1 个整数参数(轨迹条当前值)

回调函数规范示例:

python 复制代码
# 正确的回调函数格式(接收轨迹条当前值)
def callback(pos):
    print(f"轨迹条当前值:{pos}")
2. cv2.getTrackbarPos ()(获取 TrackBar 当前值)

实时获取轨迹条的数值,是实现轨迹条交互的核心。

函数格式

复制代码
cv2.getTrackbarPos(trackbarname, winname)

参数说明

参数名 类型 含义及代码中的实际应用
trackbarname 字符串 要获取值的轨迹条名称(需和cv2.createTrackbar中定义的名称一致):代码中分别获取 "R"、"G"、"B" 的当前值
winname 字符串 轨迹条所在的窗口名称(需和创建轨迹条时的窗口名一致):代码中为 "trackbar"
返回值 整数 轨迹条的当前数值(范围 0 到创建时设置的count值,代码中 0-255)

总结

  1. cv2.createTrackbar核心参数是「轨迹条名、窗口名、初始值、最大值、回调函数」,轨迹条必须依附已创建的窗口,最大值通常设为 255(匹配 RGB 颜色范围);
  2. cv2.getTrackbarPos仅需「轨迹条名、窗口名」即可获取当前值,是实现轨迹条交互的关键;
  3. 回调函数需接收 1 个整数参数(轨迹条当前值),若无需响应数值变化,可传入空函数。
相关推荐
weixin_4684668511 小时前
YOLOv13结合代码原理详细解析及模型安装与使用
人工智能·深度学习·yolo·计算机视觉·图像识别·目标识别·yolov13
kylezhao201912 小时前
C# 语言基础(变量、数据类型、流程控制、面向对象编程)
开发语言·计算机视觉·c#·visionpro
weixin_4130632114 小时前
测试 focus stacking
opencv·测试·focus stacking
weixin_4334176714 小时前
Canny边缘检测算法原理与实现
python·opencv·算法
十铭忘16 小时前
SAM2跟踪的理解19——位置编码
人工智能·深度学习·计算机视觉
澜莲花18 小时前
python图色之opencv基础---验证码实战
开发语言·python·opencv
zl_vslam19 小时前
SLAM中的非线性优-3D图优化之相对位姿Between Factor位姿图优化(十三)
人工智能·算法·计算机视觉·3d
nwsuaf_huasir21 小时前
采用梯度下降法优化波形的自相关特性
人工智能·计算机视觉·目标跟踪
only-lucky21 小时前
Python版本OpenCV
开发语言·python·opencv