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

Python+OpenCV同时打开多摄像头触发(-215:Assertion failed)错误

问题原因

  • 核心报错(-215: Assertion failed)! _src.empty()的本质是调用cv2.imshow时传入的图像帧为空,OpenCV无法处理空帧所以触发断言报错,程序崩溃后窗口自然自动关闭。
  • 具体触发点如下:
    1. 逻辑判断错误:仅校验了第一个本地摄像头vid1的读取返回值ret,只要vid1读取成功,不管vid2、vid3有没有读到有效帧,都会直接调用imshow显示frame1、frame2,一旦后两个摄像头读取失败返回空帧就会直接报错。
    2. IP摄像头参数使用错误:cv2.CAP_DSHOW是Windows平台针对本地USB摄像头的驱动参数,不能用于IP网络视频流,加了这个参数会导致vid3全程无法读取到有效帧。
    3. 其他可能触发场景:本地摄像头索引编号和实际设备不匹配、IP摄像头和电脑不在同一局域网、IP摄像头地址填写错误、网络带宽不足导致丢帧。

修复方案

修改后的可运行代码如下,运行前请确认IP摄像头地址正确、手机和电脑在同一局域网下:

import numpy as np
import cv2

# 初始化摄像头
vid1 = cv2.VideoCapture(0, cv2.CAP_DSHOW)
vid2 = cv2.VideoCapture(1, cv2.CAP_DSHOW)
# IP摄像头不要加CAP_DSHOW参数
vid3 = cv2.VideoCapture("http://192.168.0.11:8080/video")

# 提前校验所有摄像头是否成功打开
if not vid1.isOpened():
    print("摄像头0打开失败,请检查设备索引")
    exit()
if not vid2.isOpened():
    print("摄像头1打开失败,请检查设备索引")
    exit()
if not vid3.isOpened():
    print("IP摄像头打开失败,请检查地址、网络连接")
    exit()

while True:
    ret, frame = vid1.read()
    ret1, frame1 = vid2.read()
    ret2, frame2 = vid3.read()

    # 每个摄像头的读取结果单独校验,读到有效帧再显示
    if ret:
        cv2.imshow("cam0", frame)
    if ret1:
        cv2.imshow("cam1", frame1)
    if ret2:
        cv2.imshow("cam3", frame2)

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

vid1.release()
vid2.release()
vid3.release()
cv2.destroyAllWindows()

内容的提问来源于stack exchange,提问作者Margarita Caballero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:54:03