本文使用环境:
开发板:linux(都行)
摄像头:普通USB摄像头即可
word is cheap show me the code
一、为什么写这篇文章?
^^^^为什么写这篇文章? 众所周知,插入外设时,在/dev/下会出现各种各样的设备文件,这些文件根据你的外设不同而不同。比如插入摄像头时会出现:
^^^^这样在应用程序中可以直接open和read。但是在实际使用过程中,如果不小心碰到了,或者接口松动了,这个设备文件会变成/dev/video2
和/dev/video3
,这样的话程序就会报错,无法读取video0
的,那么能不能固定插入的设备名称呢????答案是可以的,因此有了这篇文章。
二、udev
2.1 什么是udev?
^^^^简而言之,udev就是一种规则,能将你插入的设备固定为唯一指定的别名。such as:你想把你的usb摄像头命名为came0
,无论你/dev
下的video
号如何变化,系统都会生成唯一的came0
。udev能帮你实现,当然不止摄像头,一切外设都能实现。具体是什么自行查阅资料。
三、设置udev规则
3.1 查看usb ID
^^^^第一步查看外设的设备号,主设备号:辅助设备号。使用命令:lsusb
^^^^通过插上和拔出可以看出本文所用设备的ID为:32e4:9422
3.2 查看usb设备的信息
^^^^使用如下命令:udevadm info -a -p /sys/class/video4linux/video0
^^^^主要看上图中标记的几个地方。这几个地方都是我用的摄像头唯一的标识。
注意 :我用的摄像头有两路视频输出,vide0和video1,两路分别输出普通视频数据和压缩视频数据,所以我这里多加了一个限制条件:ATTR{index}==“0”,如果你的摄像头时单路的,就不需要这一个条件
3.3 编辑规则
^^^^进入/etc/udev/rules.d/
文件夹下,新建video.rules
文件,文件内容如下:
KERNEL=="video*" , ATTRS{idVendor}== "32e4", ATTRS{idProduct}=="9422", ATTR{index}=="0",MODE:="0777", SYMLINK+="came0"
KERNEL=="video*" , ATTRS{idVendor}== "32e4", ATTRS{idProduct}=="9422", ATTR{index}=="1",MODE:="0777", SYMLINK+="came1"
^^^^上述内容和3.2
查到的内容一一对应。根据自己的实际情况进行修改即可。上述规则生效后会在/dev/
下生成/dev/came0和/dev/came1
两个摄像头。配置完成后关机重启
^^^^新建好后如下:
3.4 使用设备
^^^^上述步骤执行完成后,再次查看dev
下设备。
^^^^此时设备已经正确加载到dev
下。使用时就更为简单了,
如果使用opencv:
cap("/dev/came0");
如果使用open打开:
dev = open("/dev/video1",O_RDWR);
4、 扩展
^^^^当然除了绑定设备以外,你还可以绑定对应的USB口,每个USB口都有一个唯一的定义,比如:
^^^^可以看出我的摄像头接的是1.3
这个口,我用的hub进行的usb扩展。你可以在规则中添加绑定:
KERNELS=="1-1.3:1.0"
这样插入的设备可以直接变成你想要的名称。