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 个整数参数(轨迹条当前值),若无需响应数值变化,可传入空函数。
相关推荐
格林威2 小时前
Baumer相机玻璃制品裂纹自动检测:提高透明材质检测精度的 6 个关键步骤,附 OpenCV+Halcon 实战代码!
人工智能·opencv·视觉检测·材质·工业相机·sdk开发·堡盟相机
哈__3 小时前
CANN加速Image-to-Image转换:风格迁移与图像编辑优化
人工智能·计算机视觉
渡我白衣5 小时前
信而有征——模型评估、验证与可信部署的完整体系
人工智能·深度学习·神经网络·目标检测·机器学习·计算机视觉·自然语言处理
xsc-xyc19 小时前
RuntimeError: Dataset ‘/data.yaml‘ error ❌ ‘_lz
人工智能·深度学习·yolo·计算机视觉·视觉检测
星爷AG I21 小时前
9-28 视觉工作记忆(AGI基础理论)
人工智能·计算机视觉·agi
橙露1 天前
视觉检测中的数字光纤放大器的核心参数和调整
人工智能·计算机视觉·视觉检测
AAD555888991 天前
基于Mask_RCNN的猫科动物目标检测识别模型实现与分析
人工智能·目标检测·计算机视觉
LittroInno1 天前
TVMS视频管理平台 —— 多种目标跟踪模式
人工智能·计算机视觉·目标跟踪
没有不重的名么1 天前
Multiple Object Tracking as ID Prediction
深度学习·opencv·计算机视觉·目标跟踪
马拉AI1 天前
VAE不再必要?北大PixelGen:像素扩散反超Latent Diffusion,重塑生成新范式
人工智能·计算机视觉