OpenCV 摄像头参数控制详解
一、所有可用的摄像头参数
python
import cv2
class AdvancedCameraController:
def __init__(self, camera_index=0):
self.camera = cv2.VideoCapture(camera_index)
def set_all_parameters(self):
"""设置各种摄像头参数"""
# ===== 基础参数 =====
self.camera.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) # 宽度
self.camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080) # 高度
self.camera.set(cv2.CAP_PROP_FPS, 30) # 帧率
# ===== 图像质量参数 =====
self.camera.set(cv2.CAP_PROP_BRIGHTNESS, 128) # 亮度 (0-255)
self.camera.set(cv2.CAP_PROP_CONTRAST, 128) # 对比度 (0-255)
self.camera.set(cv2.CAP_PROP_SATURATION, 128) # 饱和度 (0-255)
self.camera.set(cv2.CAP_PROP_HUE, 0) # 色调
self.camera.set(cv2.CAP_PROP_GAIN, 0) # 增益
self.camera.set(cv2.CAP_PROP_EXPOSURE, -5) # 曝光 (负值=自动)
# ===== 聚焦参数 =====
self.camera.set(cv2.CAP_PROP_AUTOFOCUS, 1) # 自动聚焦 (0=关闭, 1=开启)
self.camera.set(cv2.CAP_PROP_FOCUS, 50) # 手动聚焦 (0-255,需关闭自动聚焦)
# ===== 白平衡 =====
self.camera.set(cv2.CAP_PROP_AUTO_WB, 1) # 自动白平衡 (0=关闭, 1=开启)
self.camera.set(cv2.CAP_PROP_WB_TEMPERATURE, 4000) # 色温 (K)
# ===== 其他参数 =====
self.camera.set(cv2.CAP_PROP_ZOOM, 100) # 缩放
self.camera.set(cv2.CAP_PROP_SHARPNESS, 128) # 锐度
self.camera.set(cv2.CAP_PROP_GAMMA, 100) # 伽马值
self.camera.set(cv2.CAP_PROP_BACKLIGHT, 0) # 背光补偿
self.camera.set(cv2.CAP_PROP_AUTO_EXPOSURE, 1) # 自动曝光 (0.25=手动, 0.75=自动)
self.camera.set(cv2.CAP_PROP_BUFFERSIZE, 1) # 缓冲区大小
def get_all_parameters(self):
"""获取当前所有参数值"""
params = {
'Width': cv2.CAP_PROP_FRAME_WIDTH,
'Height': cv2.CAP_PROP_FRAME_HEIGHT,
'FPS': cv2.CAP_PROP_FPS,
'Brightness': cv2.CAP_PROP_BRIGHTNESS,
'Contrast': cv2.CAP_PROP_CONTRAST,
'Saturation': cv2.CAP_PROP_SATURATION,
'Hue': cv2.CAP_PROP_HUE,
'Gain': cv2.CAP_PROP_GAIN,
'Exposure': cv2.CAP_PROP_EXPOSURE,
'AutoFocus': cv2.CAP_PROP_AUTOFOCUS,
'Focus': cv2.CAP_PROP_FOCUS,
'Auto White Balance': cv2.CAP_PROP_AUTO_WB,
'White Balance Temp': cv2.CAP_PROP_WB_TEMPERATURE,
'Zoom': cv2.CAP_PROP_ZOOM,
'Sharpness': cv2.CAP_PROP_SHARPNESS,
'Gamma': cv2.CAP_PROP_GAMMA,
'Backlight': cv2.CAP_PROP_BACKLIGHT,
'Auto Exposure': cv2.CAP_PROP_AUTO_EXPOSURE,
}
print("\n当前摄像头参数:")
print("=" * 50)
for name, prop in params.items():
value = self.camera.get(prop)
print(f"{name:<25}: {value}")
print("=" * 50)
# 使用示例
cam = AdvancedCameraController(0)
cam.get_all_parameters()
二、完整的OpenCV摄像头属性列表
python
# 所有cv2.CAP_PROP_* 常量
cv2.CAP_PROP_POS_MSEC # 视频文件的当前位置(毫秒)
cv2.CAP_PROP_POS_FRAMES # 当前帧的索引(从0开始)
cv2.CAP_PROP_POS_AVI_RATIO # 视频文件的相对位置(0=开始,1=结束)
cv2.CAP_PROP_FRAME_WIDTH # 帧宽度
cv2.CAP_PROP_FRAME_HEIGHT # 帧高度
cv2.CAP_PROP_FPS # 帧率
cv2.CAP_PROP_FOURCC # 编码格式
cv2.CAP_PROP_FRAME_COUNT # 视频文件的总帧数
cv2.CAP_PROP_FORMAT # 图像格式
cv2.CAP_PROP_MODE # 捕获模式
cv2.CAP_PROP_BRIGHTNESS # 亮度
cv2.CAP_PROP_CONTRAST # 对比度
cv2.CAP_PROP_SATURATION # 饱和度
cv2.CAP_PROP_HUE # 色调
cv2.CAP_PROP_GAIN # 增益
cv2.CAP_PROP_EXPOSURE # 曝光
cv2.CAP_PROP_CONVERT_RGB # 是否转换为RGB
cv2.CAP_PROP_WHITE_BALANCE_U # 白平衡U
cv2.CAP_PROP_WHITE_BALANCE_V # 白平衡V
cv2.CAP_PROP_RECTIFICATION # 立体摄像头的校正标志
cv2.CAP_PROP_MONOCHROME # 单色模式
cv2.CAP_PROP_SHARPNESS # 锐度
cv2.CAP_PROP_AUTO_EXPOSURE # 自动曝光
cv2.CAP_PROP_GAMMA # 伽马值
cv2.CAP_PROP_TEMPERATURE # 温度
cv2.CAP_PROP_TRIGGER # 触发模式
cv2.CAP_PROP_TRIGGER_DELAY # 触发延迟
cv2.CAP_PROP_ZOOM # 缩放
cv2.CAP_PROP_FOCUS # 聚焦
cv2.CAP_PROP_GUID # 全局唯一标识符
cv2.CAP_PROP_ISO_SPEED # ISO感光度
cv2.CAP_PROP_BACKLIGHT # 背光补偿
cv2.CAP_PROP_PAN # 平移
cv2.CAP_PROP_TILT # 倾斜
cv2.CAP_PROP_ROLL # 滚转
cv2.CAP_PROP_IRIS # 光圈
cv2.CAP_PROP_SETTINGS # 弹出设置对话框(仅Windows)
cv2.CAP_PROP_BUFFERSIZE # 内部缓冲区大小
cv2.CAP_PROP_AUTOFOCUS # 自动聚焦
cv2.CAP_PROP_AUTO_WB # 自动白平衡
cv2.CAP_PROP_WB_TEMPERATURE # 白平衡色温
三、聚焦控制详解(重点)
1. 自动聚焦 vs 手动聚焦
python
class FocusController:
def __init__(self, camera_index=0):
self.camera = cv2.VideoCapture(camera_index)
def enable_autofocus(self):
"""启用自动聚焦"""
success = self.camera.set(cv2.CAP_PROP_AUTOFOCUS, 1)
if success:
print("✓ 自动聚焦已启用")
else:
print("✗ 摄像头不支持自动聚焦控制")
return success
def disable_autofocus(self):
"""关闭自动聚焦(切换到手动模式)"""
success = self.camera.set(cv2.CAP_PROP_AUTOFOCUS, 0)
if success:
print("✓ 自动聚焦已关闭,切换到手动模式")
else:
print("✗ 无法关闭自动聚焦")
return success
def set_manual_focus(self, focus_value):
"""
设置手动聚焦值
focus_value: 0-255 (取决于摄像头型号)
- 0: 近焦
- 255: 远焦
注意:需要先关闭自动聚焦
"""
# 先关闭自动聚焦
self.disable_autofocus()
# 设置聚焦值
success = self.camera.set(cv2.CAP_PROP_FOCUS, focus_value)
if success:
print(f"✓ 聚焦值设置为: {focus_value}")
else:
print("✗ 摄像头不支持手动聚焦控制")
return success
def get_focus_info(self):
"""获取当前聚焦状态"""
autofocus = self.camera.get(cv2.CAP_PROP_AUTOFOCUS)
focus_value = self.camera.get(cv2.CAP_PROP_FOCUS)
print(f"\n聚焦状态:")
print(f"自动聚焦: {'启用' if autofocus == 1 else '关闭'}")
print(f"聚焦值: {focus_value}")
return autofocus, focus_value
def interactive_focus_adjustment(self):
"""交互式调整聚焦"""
print("\n交互式聚焦调整")
print("按键说明:")
print(" 'a': 启用自动聚焦")
print(" 'm': 切换到手动聚焦")
print(" '+': 增加聚焦值(远焦)")
print(" '-': 减少聚焦值(近焦)")
print(" 'i': 显示当前聚焦信息")
print(" 'q': 退出")
focus_value = 128 # 初始值
while True:
ret, frame = self.camera.read()
if not ret:
break
# 显示当前聚焦值
cv2.putText(frame, f"Focus: {int(focus_value)}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow('Focus Adjustment', frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
elif key == ord('a'):
self.enable_autofocus()
elif key == ord('m'):
self.disable_autofocus()
elif key == ord('+') or key == ord('='):
focus_value = min(255, focus_value + 5)
self.set_manual_focus(focus_value)
elif key == ord('-') or key == ord('_'):
focus_value = max(0, focus_value - 5)
self.set_manual_focus(focus_value)
elif key == ord('i'):
self.get_focus_info()
cv2.destroyAllWindows()
# 使用示例
focus_ctrl = FocusController(0)
focus_ctrl.get_focus_info()
focus_ctrl.interactive_focus_adjustment()
2. 检测摄像头支持的功能
python
def check_camera_capabilities(camera_index=0):
"""检测摄像头支持哪些功能"""
camera = cv2.VideoCapture(camera_index)
capabilities = {
'分辨率调整': 'CAP_PROP_FRAME_WIDTH',
'帧率调整': 'CAP_PROP_FPS',
'亮度': 'CAP_PROP_BRIGHTNESS',
'对比度': 'CAP_PROP_CONTRAST',
'饱和度': 'CAP_PROP_SATURATION',
'色调': 'CAP_PROP_HUE',
'增益': 'CAP_PROP_GAIN',
'曝光': 'CAP_PROP_EXPOSURE',
'自动聚焦': 'CAP_PROP_AUTOFOCUS',
'手动聚焦': 'CAP_PROP_FOCUS',
'自动白平衡': 'CAP_PROP_AUTO_WB',
'白平衡色温': 'CAP_PROP_WB_TEMPERATURE',
'缩放': 'CAP_PROP_ZOOM',
'锐度': 'CAP_PROP_SHARPNESS',
'伽马': 'CAP_PROP_GAMMA',
'背光补偿': 'CAP_PROP_BACKLIGHT',
}
print(f"\n摄像头 {camera_index} 功能检测:")
print("=" * 60)
for feature_name, prop_name in capabilities.items():
prop = getattr(cv2, prop_name)
# 尝试获取当前值
current_value = camera.get(prop)
# 尝试设置一个测试值
test_value = current_value + 1 if current_value >= 0 else 100
set_success = camera.set(prop, test_value)
new_value = camera.get(prop)
# 判断是否支持
if set_success and new_value != current_value:
status = "✓ 支持"
print(f"{feature_name:<15}: {status} (当前值: {current_value:.2f})")
# 恢复原值
camera.set(prop, current_value)
else:
status = "✗ 不支持"
print(f"{feature_name:<15}: {status}")
print("=" * 60)
camera.release()
# 检测
check_camera_capabilities(0)
四、完整的摄像头控制面板
python
import cv2
import numpy as np
class CameraControlPanel:
def __init__(self, camera_index=0):
self.camera = cv2.VideoCapture(camera_index)
# 可调参数
self.params = {
'brightness': {'current': 128, 'min': 0, 'max': 255, 'prop': cv2.CAP_PROP_BRIGHTNESS},
'contrast': {'current': 128, 'min': 0, 'max': 255, 'prop': cv2.CAP_PROP_CONTRAST},
'saturation': {'current': 128, 'min': 0, 'max': 255, 'prop': cv2.CAP_PROP_SATURATION},
'exposure': {'current': -5, 'min': -13, 'max': -1, 'prop': cv2.CAP_PROP_EXPOSURE},
'focus': {'current': 128, 'min': 0, 'max': 255, 'prop': cv2.CAP_PROP_FOCUS},
}
self.window_name = 'Camera Control Panel'
cv2.namedWindow(self.window_name)
# 创建滑动条
for name, param in self.params.items():
cv2.createTrackbar(
name,
self.window_name,
param['current'],
param['max'] - param['min'],
lambda x, n=name: self.on_trackbar_change(n, x)
)
def on_trackbar_change(self, param_name, value):
"""滑动条变化回调"""
param = self.params[param_name]
actual_value = param['min'] + value
success = self.camera.set(param['prop'], actual_value)
if success:
param['current'] = actual_value
print(f"{param_name}: {actual_value}")
else:
print(f"无法设置 {param_name}")
def run(self):
"""运行控制面板"""
print("\n摄像头控制面板")
print("使用滑动条调整参数")
print("按 'q' 退出, 'r' 重置, 's' 截图, 'a' 自动聚焦")
while True:
ret, frame = self.camera.read()
if not ret:
break
# 显示当前参数值
y = 30
for name, param in self.params.items():
text = f"{name}: {param['current']}"
cv2.putText(frame, text, (10, y),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
y += 30
cv2.imshow(self.window_name, frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
elif key == ord('r'):
self.reset_parameters()
elif key == ord('s'):
cv2.imwrite('screenshot.jpg', frame)
print("截图已保存")
elif key == ord('a'):
self.camera.set(cv2.CAP_PROP_AUTOFOCUS, 1)
print("自动聚焦已启用")
self.camera.release()
cv2.destroyAllWindows()
def reset_parameters(self):
"""重置所有参数到默认值"""
defaults = {
'brightness': 128,
'contrast': 128,
'saturation': 128,
'exposure': -5,
'focus': 128,
}
for name, value in defaults.items():
if name in self.params:
self.camera.set(self.params[name]['prop'], value)
cv2.setTrackbarPos(name, self.window_name, value)
print("参数已重置")
# 使用
panel = CameraControlPanel(0)
panel.run()
五、重要注意事项
⚠️ 摄像头硬件限制
python
"""
1. 并非所有参数都被所有摄像头支持
- 普通USB摄像头:通常只支持分辨率、亮度、对比度
- 高端摄像头:支持聚焦、曝光、白平衡等高级功能
2. 聚焦控制的常见问题:
- 很多廉价摄像头是固定焦距,不支持聚焦调整
- 有些摄像头只支持自动聚焦,不支持手动控制
- 聚焦值的范围因摄像头而异(不一定是0-255)
3. 驱动问题:
- Windows: DirectShow后端,支持较好
- Linux: V4L2后端,需要正确的驱动
- macOS: AVFoundation后端,部分功能受限
4. 测试方法:
- 使用 check_camera_capabilities() 函数检测
- 尝试设置参数后,用 get() 读取验证是否成功
"""
# 安全的参数设置方法
def safe_set_camera_param(camera, prop, value):
"""安全地设置摄像头参数"""
old_value = camera.get(prop)
success = camera.set(prop, value)
new_value = camera.get(prop)
if success and abs(new_value - value) < 0.1:
print(f"✓ 参数设置成功: {value}")
return True
else:
print(f"✗ 参数设置失败 (可能不支持)")
print(f" 期望值: {value}")
print(f" 实际值: {new_value}")
return False
六、Linux下使用v4l2-ctl控制摄像头
如果OpenCV无法控制某些参数,可以使用系统工具:
bash
# 安装v4l2工具
sudo apt-get install v4l-utils
# 列出所有摄像头
v4l2-ctl --list-devices
# 查看摄像头支持的所有参数
v4l2-ctl -d /dev/video0 --all
# 设置聚焦
v4l2-ctl -d /dev/video0 --set-ctrl=focus_auto=0 # 关闭自动聚焦
v4l2-ctl -d /dev/video0 --set-ctrl=focus_absolute=50 # 设置聚焦值
# 设置曝光
v4l2-ctl -d /dev/video0 --set-ctrl=exposure_auto=1 # 手动曝光
v4l2-ctl -d /dev/video0 --set-ctrl=exposure_absolute=200
总结:聚焦控制取决于摄像头硬件支持,建议先用检测函数测试摄像头支持哪些功能!