Linux下opencv无法打开摄像头

5 篇文章 0 订阅
2 篇文章 0 订阅

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下,也可以自己新建一个.rules文件),添加如下规则

SUBSYSTEM=="video*",ATTRS{idVendor}=="05a3",ATTRS{idProduct}=="9750",MODE="0666",SYMLINK+="video1"

执行以下命令,使udev规则生效:

sudo udevadm control --reload-rules
sudo service udev restart
sudo udevadm trigger

如果只配置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摄像头挂载点映射,固定设备节点名称,这样我们就可以继续愉快的开发了。

感谢阅读,我是智科创玩,希望文章能够解决您的问题。
事为之,须极致!

  • 7
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值