RK3399PRO打不开UVC摄像头
今天在RK3399PRO上源码编译完opencv,测试神奇的事情发生了,/dev/video0-9标号都占用了,然而并没有插入摄像头。
查找了半天原因,准备删除这些设备节点,都不见成效,终于忍不住了,不再去考虑删除,拿出搞ROS期间用过的绝技,linux udev固定设备号/多路USB固定设备号
下面就来详细描述这个过程吧!
1.问题记录
1.1 获得摄像头的index详细情况
v4l2-ctl --list-devices
如果提示没有v4l2,使用sudo apt-get install v4l-utils安装
sudo apt-get install v4l-utils
1.2 查看设备节点情况
ls -l /dev/video* -l
插上uvc摄像头,多了 /dev/video10 和 /dev/video11,此处直接多了两个标号,感觉像是RK3399PRO的bug
2.解决过程
2.1 查看 /dev/video10 和 /dev/video11详细信息
udevadm info --attribute-walk --name=/dev/video10
udevadm info --attribute-walk --name=/dev/video11
2.2 使用udev规则创建usb摄像头挂载点映射
在 /etc/udev/rules.d/*.rules (任意rules下),添加如下规则
SUBSYSTEM=="video*",ATTRS{idVendor}=="05a3",ATTRS{idProduct}=="9750",MODE="0666",SYMLINK+="video1"
`如果只配置ATTRS{idVendor},ATTRS{idProduct}这两个id参数,会随机指定一个 /dev/video10 和 /dev/video11映射到指定的 /dev/video1 ,由于RK3399PRO的bug的存在(插入一个usb摄像头会产生两个video标号),不能满足使用要求。
通过观察2.1的详细信息,发现 /dev/video10 和 /dev/video11的ATTR{index}不同(分别为0、1),又指定ATTR{index}实现分别对应映射
SUBSYSTEM=="video*",ATTRS{idVendor}=="05a3",ATTRS{idProduct}=="9750",ATTR{index}=="0",MODE="0666",SYMLINK+="video0"
SUBSYSTEM=="video*",ATTRS{idVendor}=="05a3",ATTRS{idProduct}=="9750",ATTR{index}=="1",MODE="0666",SYMLINK+="video1"
结果如下:
/etc/udev/rules.d/*.rules里内容如下:
总结:Linux下opencv无法打开摄像头,/dev/video 设备节点被占用,无法删除,转变思路,使用udev规则创建usb摄像头挂载点映射,固定设备节点名称,这样我们就可以继续愉快的开发了。
感谢阅读,我是智科创玩,希望文章能够解决您的问题。
事为之,须极致!