树莓派4无法初始化两个OpenCV VideoCapture实例实现双摄像头录制
解决方案
该问题是树莓派平台下OpenCV后端默认配置、设备号匹配、USB带宽限制共同导致的,按以下步骤修改即可解决:
- 确认摄像头实际设备号
树莓派的V4L2设备号和笔记本电脑并不通用,先执行命令ls /dev/video*查看所有视频设备节点,每个USB摄像头对应第一个编号的节点为视频捕获节点(比如两个摄像头通常对应/dev/video0、/dev/video2,不要使用带1、3后缀的元数据节点),替换代码中的设备编号。 - 指定V4L2后端打开摄像头,绕开GStreamer兼容问题
树莓派编译的OpenCV默认优先调用GStreamer后端,识别设备容易失败,直接指定用V4L2后端打开即可,修改初始化代码:# 0和2替换为上一步查到的实际设备号 cap_1 = cv2.VideoCapture(0, cv2.CAP_V4L2) cap_2 = cv2.VideoCapture(2, cv2.CAP_V4L2) # 增加打开成功校验,避免后续空指针报错 if not cap_1.isOpened() or not cap_2.isOpened(): print("摄像头打开失败,请检查设备号") exit() - 手动固定摄像头参数,避免USB带宽不足
树莓派USB控制器总带宽有限,两个摄像头同时工作时自动协商的参数容易占满带宽,初始化后手动设置固定分辨率和帧率:cap_1.set(cv2.CAP_PROP_FRAME_WIDTH, 320) cap_1.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) cap_1.set(cv2.CAP_PROP_FPS, 15) cap_2.set(cv2.CAP_PROP_FRAME_WIDTH, 320) cap_2.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) cap_2.set(cv2.CAP_PROP_FPS, 15) - 修复文件名非法字符
原代码时间格式带冒号,部分文件系统会写入失败,修改时间格式化代码:date_0 = time.strftime("%Y-%m-%d %H-%M-%S", time.localtime()) - 增加帧读取校验
循环内读取帧后先判断返回值是否为真,读取失败就跳过当前帧,避免后续操作空帧报错:ret_1, frame_1 = cap_1.read() ret_2, frame_2 = cap_2.read() if not ret_1 or not ret_2: continue
内容的提问来源于stack exchange,提问作者Alejandro Arias
相关产品推荐
相关产品推荐

