USB 장치 카메라를 찾는 방법은 무엇입니까?

USB 장치 카메라를 찾는 방법은 무엇입니까?

저는 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

관련 정보