树莓派3B+ Ubuntu系统下OpenCV调用USB摄像头select() timeout报错咨询
树莓派3B+ UVC摄像头USB总线卡死故障解决方案
永久修复方案
- 修正USB控制器内核参数:编辑
/boot/firmware/cmdline.txt,在整行参数的末尾追加dwc_otg.fiq_fsm_mask=0x3 dwc_otg.nak_holdoff=1,保存后重启。这两个参数针对树莓派3B+的USB控制器硬件缺陷优化中断处理逻辑,从内核层面解决URB提交失败的问题。 - 补全OpenCV资源释放逻辑:现有代码未显式释放VideoCapture实例,多次运行会导致USB句柄泄漏。每次使用完摄像头后必须调用
c.release(),若循环采集帧可以增加异常捕获逻辑,出现读取失败时主动释放资源再退出。 - 调整采集初始化参数:初始化VideoCapture时增加缓冲区限制,添加代码
c.set(cv2.CAP_PROP_BUFFERSIZE, 2),减少内核帧缓存积压导致的超时。 - 替换更新UVC驱动:编译安装最新版media_build模块,更新系统自带的uvcvideo驱动,修复老版本驱动对部分USB摄像头的适配bug。
无需重启的临时恢复方案
- 重置USB总线:先执行
lsusb查询摄像头对应的总线和设备编号,例如输出Bus 001 Device 004: ID 1234:5678 USB Camera,则执行sudo usbreset 001/004重置单设备;如果提示usbreset命令不存在,先执行sudo apt install usbutils安装即可。若所有USB端口失效,执行以下命令重置整个USB控制器:
echo '1-1' | sudo tee /sys/bus/usb/drivers/usb/unbind sleep 3 echo '1-1' | sudo tee /sys/bus/usb/drivers/usb/bind
- 清理残留资源:USB重置完成后,执行
sudo killall -9 python3杀掉所有残留的目标检测进程,再重新加载uvcvideo驱动:sudo rmmod uvcvideo && sudo modprobe uvcvideo,即可正常启动程序。
内容的提问来源于stack exchange,提问作者fffff
相关产品推荐
相关产品推荐

