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 个整数参数(轨迹条当前值),若无需响应数值变化,可传入空函数。
相关推荐
西柚小萌新20 小时前
【计算机视觉CV:目标检测】--3.算法原理(SPPNet、Fast R-CNN、Faster R-CNN)
算法·目标检测·计算机视觉
一招定胜负20 小时前
OpenCV实战:透视变换原理与发票矫正全解析
人工智能·opencv·计算机视觉
薛不痒20 小时前
计算机视觉opencv之图像透视转换&角点检测&sift特征检测&指纹识别
人工智能·opencv·计算机视觉
saoys21 小时前
Opencv 学习笔记:列表筛选(查找满足指定间距的数值)
笔记·opencv·学习
C系语言1 天前
安装Python版本opencv命令
开发语言·python·opencv
飞Link1 天前
深度解析计算机视觉中的垂直与水平边缘检测
人工智能·计算机视觉
X在敲AI代码1 天前
open-cv轻松入门
人工智能·opencv·计算机视觉
郭涤生1 天前
AWB算法基础理解
人工智能·算法·计算机视觉
闻缺陷则喜何志丹1 天前
【超音速专利 CN117058421A】基于多头模型的图像检测关键点方法、系统、平台及介质
人工智能·深度学习·计算机视觉·关键点·专栏·超音速
qwerasda1238522 天前
基于cornernet_hourglass104的纸杯检测与识别模型训练与优化详解
人工智能·计算机视觉·目标跟踪