问题描述:
在树莓派上使用多个USB摄像头时,如何确定各个摄像头所对应的id?
比如,当有两个摄像头时,我尝试一个为cv2.VideoCapture(0),一个为cv2.VideoCapture(1),通过看捕获的图像,可以确定各摄像头的id,但这个顺序不是固定的,树莓派在通电的时候,哪一个摄像头先通电的,哪一个就是0,下一个就是1,2,3,4,5…
但这样毕竟很被动,在我们的代码上就很麻烦了,没办法确定摄像头是那一个!
现在我们就来解决这个问题(全网首份保姆级教程):
1.查看USB摄像头的ID
在终端上输入lsusb
lsusb
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200927153953925.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzgwODcwOA==,size_16,color_FFFFFF,t_70#pic_center)
我这里使用了2个USB摄像头,通过插拔,确定摄像头的ID是哪个!
2.将端口重映射到新的固定的名字:
将端口重映射到新的固定的名字,并且设置其权限为可读。使用对应的id端口映射到固定的名字上(看不懂无所谓,按教程来,往下走)
终端输入:
sudo vi /etc/udev/rules.d/rplidar.rules
1.按i,进入编辑模式
2.复制以下代码,修改ID,自定义设备的名字
KERNEL=="video*", ATTRS{idVendor}=="038f", ATTRS{idProduct}=="6001", MODE:="0777", SYMLINK+="people_video"
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020092715533499.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzgwODcwOA==,size_16,color_FFFFFF,t_70#pic_center)
3.按Esc,输入 :wq (保存退出)
创建生效后重新插拔一下USB摄像头
3.查看USB摄像头是否重映射:
ls -l /dev |grep video
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200927160254526.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzgwODcwOA==,size_16,color_FFFFFF,t_70#pic_center)
我这里两个摄像头都映射成功了!
4.在树莓派python上的应用:
平时我们是这样子使用的:
cap = cv2.VideoCapture(0) # 打开USB摄像头对象
现在精准打开某个摄像头
cap = cv2.VideoCapture("/dev/people_video") # 打开人体识别摄像头
cap = cv2.VideoCapture("/dev/goods_video") # 打开物体识别摄像头
总结:理论上不管USB摄像头插在那个usb端口上,什么时候上电,都能通过 /dev/people_video (自己定义的名字)打开相对应的摄像头
遇到的问题:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200927172106699.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzgwODcwOA==,size_16,color_FFFFFF,t_70#pic_center)