一、鼠标控制
示例代码:
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) |
总结
- 鼠标回调函数的参数必须严格遵循「event, x, y, flags, userdata」的顺序,前 4 个由 OpenCV 自动传入,最后 1 个是用户自定义数据;
cv2.setMouseCallback的核心是绑定「窗口名」和「回调函数」,窗口名必须和创建的窗口一致;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) |
总结
cv2.createTrackbar核心参数是「轨迹条名、窗口名、初始值、最大值、回调函数」,轨迹条必须依附已创建的窗口,最大值通常设为 255(匹配 RGB 颜色范围);cv2.getTrackbarPos仅需「轨迹条名、窗口名」即可获取当前值,是实现轨迹条交互的关键;- 回调函数需接收 1 个整数参数(轨迹条当前值),若无需响应数值变化,可传入空函数。