You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决OpenCV Python调用多个USB摄像头时单可用双调用失败问题

多USB摄像头同时调用异常解决方案

这个问题最常见诱因是USB控制器带宽不足,两个摄像头单独工作时占用带宽未达上限,同时调用时超出USB控制器带宽阈值,导致其中一个无法正常读取帧,可按以下步骤排查修复:

  • 优先排查USB硬件连接
    把两个摄像头插到不同USB控制器的接口上,比如一个插USB2.0口、另一个插USB3.0口,避免多个设备共享同一个USB总线带宽。
  • 补全初始化校验,添加初始化延迟
    原代码未判断VideoCapture对象是否成功打开设备,且两个摄像头初始化间隔过短可能导致冲突,需要在每次初始化摄像头后添加1~2秒的延迟,同时校验打开状态。
  • 手动降低摄像头采集分辨率,减少带宽占用
    每个摄像头初始化完成后,手动设置较低的采集分辨率,优先保证两路流能同时输出。
  • 修正代码逻辑bug
    原代码在未判断ret1有效性的前提下直接调用cv2.imshow('Cam 1', frame1),如果帧读取失败,空帧传入imshow会触发异常,需要删掉这行无效代码。

修正后可用代码示例

import numpy as np
import cv2
import time

# 初始化第一个摄像头
video_capture_0 = cv2.VideoCapture(0, cv2.CAP_DSHOW)
if not video_capture_0.isOpened():
    print("摄像头0打开失败")
    exit()
# 手动设置分辨率,可根据需求调整
video_capture_0.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
video_capture_0.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
time.sleep(1)

# 初始化第二个摄像头
video_capture_1 = cv2.VideoCapture(1, cv2.CAP_DSHOW)
if not video_capture_1.isOpened():
    print("摄像头1打开失败")
    exit()
video_capture_1.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
video_capture_1.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
time.sleep(1)

while True:
    ret0, frame0 = video_capture_0.read()
    ret1, frame1 = video_capture_1.read()

    if ret0:
        cv2.imshow('Cam 0', frame0)
    if ret1:
        cv2.imshow('Cam 1', frame1)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video_capture_0.release()
video_capture_1.release()
cv2.destroyAllWindows()

补充排查方向

如果以上方法仍无法解决问题,可以尝试更换VideoCapture的后端参数,比如把cv2.CAP_DSHOW换成cv2.CAP_MSMF,或者去掉后端参数让OpenCV自动匹配;另外也可以去设备管理器里查看摄像头的实际设备编号,确认编号确实是0和1,部分设备可能存在编号跳号的情况。

内容的提问来源于stack exchange,提问作者Atiqur Rahman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:21:02