OpenCV调用USB摄像头/相机,并解决1080p下的延迟卡顿问题(附Python代码)

1. 加载摄像头

首先直接放上一段加载USB相机的例程供参考

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time     : 2023/5/16 10:22
# @Author   : Chenan_Wang
# @File     : cv_test.py
# @Project  : pad_det 
# @Software : PyCharm

import cv2 as cv

if __name__ == "__main__":
    cap = cv.VideoCapture()
    cap.open(1, cv.CAP_DSHOW)       # 我这里0为电脑自带摄像头,1为外接相机

    while True:
        if not cap.isOpened():
            print('can not open camera')
            break
        ret, frame = cap.read()     # 读取图像
        if not ret:                 # 图像读取失败则直接进入下一次循环
            continue

        cv.namedWindow("cv_test")
        cv.imshow('cv_test', frame)

        my_key = cv.waitKey(1)
        # 按q退出循环,0xFF是为了排除一些功能键对q的ASCII码的影响
        if my_key & 0xFF == ord('q'):
            break

    #释放资源
    cap.release()
    cv.destroyAllWindows()

2. 高分辨率视频流延迟问题

摄像头成功加载出来,但是默认分辨率太低(我的相机支持的是1080p),通过如下代码设置分辨率和帧率:

cap.set(cv.CAP_PROP_FRAME_WIDTH, 1920)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080)
cap.set(cv.CAP_PROP_FPS, 30)

此时分辨率是1080p了,但是延迟严重,在网上找了一堆方法,几乎都不可用!!!

  • 设置格式为MJPG:
cap.set(cv.CAP_PROP_FOURCC, cv.VideoWriter_fourcc('M', 'J', 'P', 'G'))

==> 无法解决问题,依然有延迟

  • 开启多线程接受图像信息,依然无法解决问题,延迟依旧

  • 发现修改为低分辨率的时候卡顿会降低,推测可能是由于分辨率太高导致的延迟现象,但是理论上来说这点算力对计算机是没影响的,结果在修改分辨率的时候突然问题就解决了 ↓


3. 延迟解决方案

设置分辨率的时候不要设置为1920x1080,改成1900x1080!,实际成像依然会匹配相机的1920x1080,保存的时候也是1920x1080

而且画面会和之前cv默认分辨率的帧率一样,及其流畅,几乎无延迟

具体啥愿意就不知道了,希望有大佬可以解答一下~

下面放上完整代码供参考:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time     : 2023/5/16 10:22
# @Author   : Chenan_Wang
# @File     : cv_test.py
# @Project  : pad_det 
# @Software : PyCharm

import cv2 as cv

if __name__ == "__main__":
    cap = cv.VideoCapture()
    cap.open(1, cv.CAP_DSHOW)       # 我这里0为电脑自带摄像头,1为外接相机
    cap.set(cv.CAP_PROP_FOURCC, cv.VideoWriter_fourcc('M', 'J', 'P', 'G'))
    cap.set(cv.CAP_PROP_FRAME_WIDTH, 1900)      # 解决问题的关键!!!
    cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080)
    cap.set(cv.CAP_PROP_FPS, 30)

    while True:
        if not cap.isOpened():
            print('can not open camera')
            break
        ret, frame = cap.read()     # 读取图像
        if not ret:                 # 图像读取失败则直接进入下一次循环
            continue
        cv.namedWindow("cv_test")
        cv.imshow('cv_test', frame)
        my_key = cv.waitKey(1)
        # 按q退出循环,0xFF是为了排除一些功能键对q的ASCII码的影响
        if my_key & 0xFF == ord('q'):
            break

    #释放资源
    cap.release()
    cv.destroyAllWindows()

  • 8
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arcann

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值