项目中使用opencv调用usb摄像头,运行过程中,会出现摄像头掉线的情况。猜测掉线原因是硬件相关,可能是摄像头,也可能是usb线和端口。
这里主要介绍两种掉线情况以及代码重连摄像头的方式。
1.第一种情况,设备在线
当camera读取图片失败时候,可以通过opencv的方法,释放摄像头再打开
camera.release()
camera = cv.VideoCapture(0)
2.第二种情况,设备不在线
video4 和 video5掉线,实际上usb还连着电脑。
碰到这种情况,可以先查看当前usb所在的上级hub。
lsusb -t
比如摄像头所在的BUS 01,Port 2
ll /sys/bus/usb/devices
查看usb的上一级。
然后通过命令行将其重置,需要root权限。
echo -n "0000:00:14.0" | tee /sys/bus/pci/drivers/xhci_hcd/unbind
echo -n "0000:00:14.0" | tee /sys/bus/pci/drivers/xhci_hcd/bind
也可以用python代码重置
def resetUsbHub(key, hub):
result = os.system('echo "{}"|sudo -S sh ./usbUnbind.sh {}'.format(key, hub))
logger.info("卸载usb结果:{}".format(result))
if result == 0:
result = os.system('echo "{}"|sudo -S sh ./usbBind.sh {}'.format(key, hub))
logger.info("加载usb结果:{}".format(result))
sh文件内容
echo $1|sudo tee /sys/bus/pci/drivers/xhci_hcd/unbind
重置以后就可以发现又能找到video4 和 video5。后续就继续通过opencv 打开摄像头就行了。