私は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