Ubuntu

如何找到 USB 設備的攝像頭?

  • September 27, 2021

我是 LINUX 的初學者,如果我的問題不是最好的,我很抱歉。我有一個使用 OpenCV lib 的 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

我找到了最簡單的解決方案,使用下一個命令:

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

引用自:https://unix.stackexchange.com/questions/670406