我是 LINUX 的初学者,如果我的问题不是最好的,很抱歉。我有一个使用 OpenCV 库的 C++ 应用程序。该应用程序在启动时通过服务运行(使用 systemctl)。我的应用程序需要 USB 摄像头设备的 ID 作为参数。我有 2 个 USB 摄像头。当我关闭这些设备时, ls /dev/video* 的输出是:
/dev/video1
如果我插入设备, ls /dev/video* 的输出为:
/dev/video0
/dev/video1
/dev/video2
所以,我找到了 USB 摄像头设备,现在我知道如何运行我的 C++ 应用程序:
./my_app 0 2
这是我的问题:我的应用程序在每次启动时自动运行,无需插入/关闭我的相机设备,因此我无法找到这些 id(在本例中为 0 和 2)。每次重新启动时,这些 id 都会不同。
只找出USB摄像头设备的规则是什么?我的操作系统:Ubuntu 18.04 LTS 我的主板:Nvidia Jetson Tx2(它有一个我不想使用的集成摄像头)
编辑:lsusb 的输出:
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 006: ID 03f0:094a Hewlett-Packard Optical Mouse [672662-001]
Bus 001 Device 004: ID 258a:0001
Bus 001 Device 039: ID 0ac8:0346 Z-Star Microelectronics Corp.
Bus 001 Device 038: ID 0ac8:0346 Z-Star Microelectronics Corp.
Bus 001 Device 037: ID 14cd:8601 Super Top
Bus 001 Device 002: ID 14cd:8601 Super Top
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
答案1
我找到了最简单的解决方案,使用下一个命令:
v4l2-ctl --list-devices
这是输出:
vi-output, ov5693 2-0036 (platform:15700000.vi:2):
/dev/video2
HBV HD CAMERA (usb-3530000.xhci-2.1.2):
/dev/video0
HBV HD CAMERA (usb-3530000.xhci-2.1.3):
/dev/video1
之后,我编写了一个脚本来仅获取 USB 摄像头设备的 ID:
keywordUSB=usb # used for searching the usb camera
lineCount=0 # index for each line command
# even lines -> type of camera device : native/usb
# odd lines -> id of camera
USB_ID_CAMERA_ARRAY=() # array where we append our id usb camera
while read cmd_line
do
if [ -z "$cmd_line" ] # ignore empty line
then
continue
else
if [ $(expr $lineCount % 2) -eq "0" ] # usb/native camera
then
if [[ "$cmd_line" == *"$keywordUSB"* ]] # true if it is a usb camera device
then
state=active # state is active only for usb camera devices
else
state=inactive # inactive for native camera
fi
else
if [[ $state == "active" ]] # this is a usb camera
then
camera_id="${cmd_line: -1}" # id camera
USB_ID_CAMERA_ARRAY+=($camera_id) # append to our array
fi
fi
fi
let "lineCount+=1"
done < <(v4l2-ctl --list-devices)
command="./myCppApp --camera-sources"
for elem in ${USB_ID_CAMERA_ARRAY[@]}
do
command="$command $elem"
done
$command