当前位置: 首页 > news >正文

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

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

http://www.dtcms.com/a/422573.html

相关文章:

  • Kimi-Audio:Kimi开源的通用音频基础模型,支持语音识别、音频理解等多种任务
  • 阿里开源视频修复方法Vivid-VR:以独特策略与架构革新,引领生成视频修复高质量可控新时代。
  • 独立开发在线客服系统手记:实现对 PostgreSQL 的支持,以及与 MySQL 的对比
  • 【项目】Vision Master OpenCV 3.0 版本(预)发行说明
  • 官方网站是什么意思网站备案 godaddy
  • 温州网站运营长沙网页制作模板
  • 前端埋点(打点)方案
  • pako处理 urlencode(gzcompress(json_encode($res))) php的加密方式web解析
  • 深入理解 SSE:服务器发送事件及其在前后端中的实践
  • Web典型路由结构之Next.js (App Router, v13+) )(文件系统驱动的路由:File-based Routing)声明式路由:文件即路由
  • 【设计模式】解释器模式
  • 【前端知识】iframe 使用详细说明
  • 推荐一款集成AI功能的数据库管理工具
  • Flask 入门:轻量级 Python Web 框架的快速上手
  • 每日前端宝藏库 | tinykeys ✨
  • 第7章:TS快速入门和前端项目初始化
  • 合肥 做网站的深圳办公室装修设计公司
  • Android实现RecyclerView粘性头部效果,模拟微信账单列表的月份标题平移
  • 建三江建设局网站网站建设自我评价怎么写比较好
  • 华为Fit4手表:个性化表盘,让生活更有温度
  • Spring Boot - 从PF4J到SBP:深入解析Java插件化架构的演进与实践
  • 河南做网站企起做平面什么网站的素材不侵权
  • 哪个网站做ppt模板赚钱手机棋牌游戏平台
  • 鸿蒙app开发中 拿到json文件数据进行动画的播放
  • 第三章 鸽巢原理
  • 智慧政务——解读57页清华大学:DeepSeek政务场景应用与解决方案【附全文阅读】
  • Transformer模型:深度解析自然语言处理的革命性架构
  • 声网AI逐字拆解问题,30天重塑口语清晰表达
  • Java异常简介
  • VSCode Web版本安装