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

関連情報