Python 中使用 OpenCV 库来捕获摄像头视频流并在窗口中显示

文章目录

一、实例代码

  1. 连接 USB 相机之后,通过指令ls /dev/video*查看设备号,通过一个简单的脚本使用 OpenCV 库来捕获摄像头视频流并在窗口中显示,ESC键退出。

    python 复制代码
    import cv2
    
    # 摄像头设备号
    cap = cv2.VideoCapture(0)
    window_name = "usb camera"
    
    # 启用 MJPEG 压缩
    cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
    
    # 尝试设置为 60 FPS(是否成功取决于摄像头)
    cap.set(cv2.CAP_PROP_FPS, 60)
    
    # 尝试设置摄像头分辨率
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
    
    # 获取实际设置的分辨率
    actual_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    actual_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    print(f"实际分辨率: {actual_width}x{actual_height}")
    
    # 打印实际帧率(FPS)
    fps = cap.get(cv2.CAP_PROP_FPS)
    print(f"摄像头帧率: {fps} FPS")
    
    cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
    cv2.resizeWindow(window_name, actual_width, actual_height)  # 窗口匹配分辨率
    
    while True:
        ret, frame = cap.read()
        if not ret:
            print("读取失败")
            break
        
        cv2.imshow(window_name, frame)
        
        if cv2.waitKey(1) == 27:  # ESC键退出
            break
    
    cap.release()
    cv2.destroyAllWindows()

二、相关设置

  1. cap.set(参数属性, 期望值),用于向摄像头硬件发送配置请求,尝试将某个参数(如编码格式、帧率、分辨率)设置为指定值。

  2. 编码格式cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M','J','P','G')) 是一个 常见且推荐的操作 ,尤其在需要高分辨率、高帧率USB带宽受限 的场景。MJPEG (Motion-JPEG)压缩能显著减少数据量,使摄像头在有限带宽下支持更高的分辨率(如1080p/4K)和帧率(如60FPS/120FPS),同时降低CPU解码负担。相比原始格式(如YUYV),MJPEG 在实时视频捕获中更高效,兼容性广,是OpenCV、工业相机及嵌入式设备的常用选择。若摄像头支持,建议优先启用 MJPEG 以优化性能,若不支持,可回退到默认格式。

  3. 帧率cap.set(cv2.CAP_PROP_FPS, 60)OpenCV 中控制帧率的属性参数,用于设置摄像头的目标采集帧率(如60FPS),60 是一个请求值,实际帧率取决于摄像头的硬件能力和当前配置的分辨率/编码格式等,可能最高仅支持30FPS,即使设置为60FPS也会自动降级。

  4. 分辨率cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) 用于设置摄像头采集画面的目标宽度(水平分辨率),1920同样是一个请求值,实际分辨率可能被摄像头自动调整为最接近的支持值。

  5. 其他参数设置可供参考并以设备实际响应为准。

    参数类别 OpenCV 属性名 典型值/选项 作用说明 适用场景
    自动曝光 CAP_PROP_AUTO_EXPOSURE 1(自动), 0(手动) 控制摄像头是否自动调整曝光量 光照变化频繁的环境(如户外)
    手动曝光 CAP_PROP_EXPOSURE 范围依赖硬件,典型范围为 -130 手动设置曝光值(正值增亮,负值减暗) 需要固定曝光(如工业检测)
    自动白平衡 CAP_PROP_AUTO_WB 1(自动), 0(手动) 启用/禁用自动白平衡 色彩准确性要求高的场景
    手动白平衡 CAP_PROP_WB_TEMPERATURE 色温值(如 5000K) 手动设置白平衡色温 特殊光照条件(如霓虹灯环境)
    缓冲区大小 CAP_PROP_BUFFERSIZE 1(最小延迟) 减少摄像头内部缓冲帧数,降低延迟 实时控制(如无人机、机器人视觉)
    自动对焦 CAP_PROP_AUTOFOCUS 1(启用), 0(禁用) 控制摄像头是否自动对焦 动态距离变化的场景(如人脸跟踪)
    手动对焦 CAP_PROP_FOCUS 0(最近)-100(最远) 手动调整对焦距离 固定焦距需求(如显微镜拍摄)
    API后端选择 cv2.VideoCapture() 的第二个参数 cv2.CAP_V4L2(Linux常用) 指定视频采集后端,解决兼容性问题 跨平台或特定系统(如Linux用V4L2)
    亮度调整 CAP_PROP_BRIGHTNESS 0-100 调整画面整体亮度 低光环境补偿
    对比度调整 CAP_PROP_CONTRAST 0-100 调整画面对比度 增强细节可见性
    饱和度调整 CAP_PROP_SATURATION 0-100 调整色彩饱和度 色彩增强或黑白模式
    增益控制 CAP_PROP_GAIN 0-100 调整信号放大倍数(可能增加噪点) 极低光照环境

小结

上述内容仅用作个人参考,如有问题欢迎在评论区指正,谢谢!!

相关推荐
民乐团扒谱机21 小时前
【微实验】谐波乘积谱(HPS)算法深度解析:原理、数学与代码实现
开发语言·人工智能·python·算法·语音识别·音乐
小白勇闯网安圈1 天前
Django Ajax、批量操作与分页实践
python·django
Logintern091 天前
Langgraph使用MemorySaver建立有记忆的图
开发语言·windows·python
浪里镖客1 天前
zed 2i相机坐标系与内参、外参
数码相机·opencv·计算机视觉
Uncommon.1 天前
使用pandas处理csv并转为张量
pytorch·python·深度学习·pandas
上玄code1 天前
【Agent精讲】调一个LLMAPI背后的工程问题
java·开发语言·python·chatgpt
Uncommon.1 天前
使用Pytorch操作张量(多维数组)
人工智能·pytorch·python
码云骑士1 天前
105-Ollama本地部署-Llama3-Qwen2-Modelfile-REST-API
python
晚安code1 天前
MCP Server 开发入门:手把手写一个能跑的 Server,三种协议怎么选
python·ai编程
CTA量化套保1 天前
量化脚本准备实盘了吗?TqSdk 上线前工程检查
人工智能·python