OpenCV 摄像头参数控制详解

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

总结:聚焦控制取决于摄像头硬件支持,建议先用检测函数测试摄像头支持哪些功能!

相关推荐
IT_陈寒2 小时前
Vue 3.4 实战:这7个Composition API技巧让我的开发效率飙升50%
前端·人工智能·后端
张较瘦_2 小时前
[论文阅读] AI+软件工程 | AI供应链信任革命:TAIBOM如何破解AI系统“可信难题“
论文阅读·人工智能·软件工程
媒体人8882 小时前
中国顶级 GEO 优化专家孟庆涛:用 15 年积淀定义 2025 年 GEO 优化新标准
人工智能·搜索引擎·chatgpt·生成式引擎优化·geo优化
山海青风3 小时前
藏语自然语言处理入门 - 5 文本归类
人工智能·自然语言处理
十步杀一人_千里不留行3 小时前
和 AI 一起修 Bug 心得体会
人工智能·bug·ai编程
网安INF3 小时前
【论文阅读】-《Sparse and Imperceivable Adversarial Attacks》
论文阅读·人工智能·计算机视觉·网络安全·对抗攻击
yzx9910133 小时前
多模态分类:图文结合的智能识别与代码实战
人工智能·分类·数据挖掘
飞翔的佩奇3 小时前
【完整源码+数据集+部署教程】 小麦病害分割系统: yolov8-seg-dyhead
python·yolo·计算机视觉·数据集·yolov8·小麦病害分割系统
小蕾Java4 小时前
PyCharm2025.2 大更新,AI是亮点!
人工智能·python