OpenCV 摄像头参数控制详解
OpenCV 摄像头参数控制详解
一、所有可用的摄像头参数
import cv2class 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摄像头属性列表
# 所有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 手动聚焦
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 successdef disable_autofocus(self):"""关闭自动聚焦(切换到手动模式)"""success = self.camera.set(cv2.CAP_PROP_AUTOFOCUS, 0)if success:print("✓ 自动聚焦已关闭,切换到手动模式")else:print("✗ 无法关闭自动聚焦")return successdef 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 successdef 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_valuedef 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) & 0xFFif key == ord('q'):breakelif 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. 检测摄像头支持的功能
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 100set_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)
四、完整的摄像头控制面板
import cv2
import numpy as npclass 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'] + valuesuccess = self.camera.set(param['prop'], actual_value)if success:param['current'] = actual_valueprint(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 = 30for 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 += 30cv2.imshow(self.window_name, frame)key = cv2.waitKey(1) & 0xFFif key == ord('q'):breakelif 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()
五、重要注意事项
⚠️ 摄像头硬件限制
"""
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 Trueelse:print(f"✗ 参数设置失败 (可能不支持)")print(f" 期望值: {value}")print(f" 实际值: {new_value}")return False
六、Linux下使用v4l2-ctl控制摄像头
如果OpenCV无法控制某些参数,可以使用系统工具:
# 安装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
总结:聚焦控制取决于摄像头硬件支持,建议先用检测函数测试摄像头支持哪些功能!