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 调整信号放大倍数(可能增加噪点) 极低光照环境

小结

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

相关推荐
Blossom.1183 小时前
基于深度学习的图像分割:使用DeepLabv3实现高效分割
人工智能·python·深度学习·机器学习·分类·机器人·transformer
深海潜水员4 小时前
【Python】 切割图集的小脚本
开发语言·python
Wendy14415 小时前
【边缘填充】——图像预处理(OpenCV)
人工智能·opencv·计算机视觉
27669582925 小时前
东方航空 m端 wasm req res分析
java·python·node·wasm·东方航空·东航·东方航空m端
星月昭铭5 小时前
Spring AI调用Embedding模型返回HTTP 400:Invalid HTTP request received分析处理
人工智能·spring boot·python·spring·ai·embedding
Dreamsi_zh6 小时前
Python爬虫02_Requests实战网页采集器
开发语言·爬虫·python
weixin_448617057 小时前
疏老师-python训练营-Day30模块和库的导入
开发语言·python
程序员三藏8 小时前
Web UI自动化测试之PO篇
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
旧时光巷8 小时前
【Flask 基础 ①】 | 路由、参数与模板渲染
后端·python·零基础·flask·web·模板渲染·路由系统
java1234_小锋8 小时前
【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博评论IP地图可视化分析实现
python·自然语言处理·flask