저는 LINUX 초보자입니다. 제 질문이 최고가 아니라면 죄송합니다. OpenCV 라이브러리를 사용하는 C++ 응용 프로그램이 있습니다. 애플리케이션은 시작 시 서비스를 통해 실행됩니다(systemctl 사용). 내 애플리케이션에는 USB 카메라 장치의 ID가 매개변수로 필요합니다. USB 카메라가 2개 있습니다. 이러한 장치를 끄면 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 카메라 장치만 찾는 규칙은 무엇인가요? 내 OS: 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