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

