#问题来源
当我们在树莓派使用CV库调用摄像头时使用cv2.VideoCapture("dev/video0")时,往往需要通过命令:
ls /dev/video*查看设备序列号,因为通常,USB设备插入时,系统会根据检测顺序分配设备号,比如video0、video1等。如果用户有多个摄像头,或者有时插拔顺序不同,设备号就会变化。而在一些需要自动化场景下我们绝对不可能手动查看序列号再修改代码,这时候需要一种方法来固定设备号,不管摄像头插在哪个USB口或者什么时候插入,设备号都保持一致。
#问题解决
要解决这个问题并实现设备号固定,可以通过 udev 规则 为摄像头绑定一个固定的设备名(如 /dev/camera_front
),无论物理设备号如何变化,都能通过固定名称访问。
#1.ls /dev/video*查看摄像头序列号
插拔摄像头,分别输入ls /dev/video*观察两次序列号变化,多出来的一对就是摄像头序列号
#2.输入命令
# 假设摄像头当前设备号为 /dev/video0
udevadm info --name=/dev/video0 --attribute-walk
鼠标往下滑并同时不断按enter键,找到以下信息:
ATTRS{idVendor}=="046d" # 厂商ID(十六进制)
ATTRS{idProduct}=="082d" # 产品ID(十六进制)
ATTRS{serial}=="1234567890" # 设备序列号(如果有)
#3.创建 udev 规则文件
#3.1 新建一个 udev 规则文件(文件名格式:数字-名称.rules
):
sudo nano /etc/udev/rules.d/99-usb-camera.rules
#3.2 写入规则
按厂商ID和产品ID绑定(这种我失败了)
SUBSYSTEM=="video4linux", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="082d", SYMLINK+="camera_front"
或者按序列号绑定(更精确,需设备支持):
SUBSYSTEM=="video4linux", ATTRS{serial}=="1234567890", SYMLINK+="camera_R"
--camera_Rs是名称,随便起
----12345678/046d/082d是步骤2查找的序列号信息
#3.3重新加载 udev 规则
sudo udevadm control --reload
sudo udevadm trigger
#4验证成果
拔插摄像头,检查设备符号链接是否生成:
ls -l /dev/camera_R #camera_R是你起的名字
输出应类似:
lrwxrwxrwx 1 root root 6 Jan 1 00:00 /dev/camera_R -> video0
成功后我们就可以用
cv2.VideoCapture("/dev/camera_R")直接访问摄像头啦~~~~~
创作不易,希望鼓励o( ̄▽ ̄)d点赞,欢迎留言评论不足