)
將采用D415深度學習相機連接全志OK527板子通過mipi屏幕做一個人臉識別系統。本文所做工作是將相機連接板子并在屏幕上輸出畫面。此環節的流程大概是硬件連接后檢查-是否識別到usb-dmesg看內核日志看是否綁定上對應驅動-檢查設備文件找到相機對應的設備文件-打開D415設備文件下對應的彩色節點-輸出彩色畫面。1.檢查是否識別到usb相機通過USB3.0與板子連接連上后需要檢查是否識別到usb設備輸入命令input:lsusb output: Bus 003 Device 001: ID 1d6b:0002 Bus 001 Device 001: ID 1d6b:0002 Bus 004 Device 001: ID 1d6b:0001 Bus 002 Device 001: ID 1d6b:0003 Bus 003 Device 003: ID 8086:0ad3 Bus 003 Device 002: ID 1a40:0101Bus表示總線號后面的Device代表根設備觀測輸出查官方設備號表可知8086:0ad3即為D415相機的設備號其掛載在總線3下的003號根設備上而Linux設定總線下的Device001代表的ID后面四位表示其對應的USB代次通過Bus 003 Device 001: ID 1d6b:0002可發現3號總線對應的是USB2.0而相機是USB3.0說明插錯了usb口隨后重新插到USB3.0上。2.觀察是否綁定了對應驅動而后需要查內核看是否綁定了對應驅動輸入命令inputdmesg | grep -iE uvc|8086|RealSense|video output usbcore: registered new interface driver uvcvideo//說明本板子中存在uvcvideo驅動設備 usb 3-1.3: New USB device found, idVendor8086, idProduct0ad3, bcdDevice51.10 usb 3-1.3: Product: Intel(R) RealSense(TM) Depth Camera 415 usb 3-1.3: Manufacturer: Intel(R) RealSense(TM) Depth Camera 415 uvcvideo 3-1.3:1.1: Unknown video format 00000050-0000-0010-8000-00aa00389b71 usb 3-1.3: Found UVC 1.50 device Intel(R) RealSense(TM) Depth Camera 415 (8086:0ad3) input: Intel(R) RealSense(TM) Depth Ca as /devices/platform/soc3000000/4200000.ehci1-controller/usb3/3-1/3-1.3/3-1.3:1.0/input/input19 usb 3-1.3: Found UVC 1.50 device Intel(R) RealSense(TM) Depth Camera 415 (8086:0ad3) # ← 這是 USB2 / EHCI看上一行路徑里的 ehci1-controller usb 1-1: New USB device found, idVendor8086, idProduct0ad3, bcdDevice51.10 usb 1-1: Product: Intel(R) RealSense(TM) Depth Camera 415 usb 1-1: Manufacturer: Intel(R) RealSense(TM) Depth Camera 415 uvcvideo 1-1:1.1: Unknown video format 00000050-0000-0010-8000-00aa00389b71 usb 1-1: Found UVC 1.50 device Intel(R) RealSense(TM) Depth Camera 415 (8086:0ad3) input: Intel(R) RealSense(TM) Depth Ca as /devices/platform/soc3000000/12.usbc2/4d00000.xhci2-controller/xhci-hcd.23.auto/usb1/1-1/1-1:1.0/input/input20 usb 1-1: Found UVC 1.50 device Intel(R) RealSense(TM) Depth Camera 415 (8086:0ad3) # ← 這是 USB3 / xHCI要用的看上一行路徑里的 xhci-hcd由于內核日志太多因此需要從全本日記里面篩關鍵詞-iE代表忽視大小寫而搜索uvc是因為USB 攝像頭在 Linux 上幾乎都走 UVC驅動名是uvcvideo8086是剛剛看到的idRealSense是深度相機的廠家型號video在攝像頭文件里面涉及最廣。從日志輸出來看由于剛才誤插入2.0后又改成插入3.0所以出現了兩次插入歷史。usb 1-1: Found UVC 1.50 device Intel(R) RealSense(TM) Depth Camera 415 (8086:0ad3)表示掛載在總線1的1號口上且已綁定uvc并被當成了UVC1.5設備。3.檢查設備文件找到相機對應的設備文件目前確定了設備已經綁定了驅動之后需要找到對應的設備文件才能進行后續的文件操作輸入input: ls -l /dev/video* which v4l2-ctl output: crw-rw---- 1 root video 81, 0 Jan 1 08:00 /dev/video0 crw-rw---- 1 root video 81, 37 Jan 1 08:02 /dev/video1 crw-rw---- 1 root video 81, 3 Jan 1 08:00 /dev/video12 crw-rw---- 1 root video 81, 4 Jan 1 08:00 /dev/video16 crw-rw---- 1 root video 81, 5 Jan 1 08:00 /dev/video17 crw-rw---- 1 root video 81, 38 Jan 1 08:02 /dev/video2 crw-rw---- 1 root video 81, 39 Jan 1 08:02 /dev/video3 crw-rw---- 1 root video 81, 1 Jan 1 08:00 /dev/video4 crw-rw---- 1 root video 81, 40 Jan 1 08:02 /dev/video5 crw-rw---- 1 root video 81, 41 Jan 1 08:02 /dev/video6 crw-rw---- 1 root video 81, 42 Jan 1 08:02 /dev/video7 crw-rw---- 1 root video 81, 2 Jan 1 08:00 /dev/video8 /usr/bin/v4l2-ctl通過ls可以初步確認存在video設備節點但無法確認具體的設備節點是哪個一般來說給項目open的設備文件都是掛載在/dev下面。通過時間戳其實也可以初步辨別再插上D415相機后出現了video1/2/3/5/6/7。然而不同的節點其功能不同對于當前需要輸出彩色畫面需要找到對應的彩色節點。因此需要用到v4l2-ctl調試工具V4L2 是 Linux 里攝像頭以及部分視頻采集/輸出設備的標準接口。而v4l2-ctl 是在命令行里操作 V4L2 設備的工具用于發現設備文件查詢并修改文件參數還可以取走節點數據。通過which命令找到了工具的位置下面需要用工具找到對應的彩色節點。4.找到D415設備文件下對應的彩色節點輸入input v4l2-ctl --list-devices for d in /dev/video1 /dev/video2 /dev/video3 /dev/video5 /dev/video6 /dev/video7; do echo $d v4l2-ctl -d $d --list-formats-ext 2/dev/null | head -n 25 done output: sunxi-vin (): /dev/video0 /dev/video4 /dev/video8 /dev/video12 /dev/video16 /dev/video17 Allwinner Vin (platform:sunxi-vin-media): /dev/media0 Intel(R) RealSense(TM) Depth Ca (usb-xhci-hcd.23.auto-1): /dev/video1 /dev/video2 /dev/video3 /dev/video5 /dev/video6 /dev/video7 /dev/media1 /dev/media2 /dev/video1 ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: Z16 (16-bit Depth) Size: Discrete 256x144 ... 90 fps Size: Discrete 480x270 / 640x360 / 640x480 / 848x480 / 1280x720 各種幀率 /dev/video2 ioctl: VIDIOC_ENUM_FMT Type: Video Capture 下面沒有 [0]沒有格式 /dev/video3 ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: GREY (8-bit Greyscale) 480x270 / 640x360 / 640x480 / 848x480 / 1280x720 [1]: UYVY (UYVY 4:2:2) head 截斷只看到 480x270 開頭 /dev/video5 ioctl: VIDIOC_ENUM_FMT Type: Video Capture 同樣沒有格式 /dev/video6 ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: YUYV (YUYV 4:2:2) 424x24060/30/15/6 fps 640x48030/15/6 fps 1280x72015/10/6 fps 1920x10808 fps /dev/video7 ioctl: VIDIOC_ENUM_FMT Type: Video Capture 沒有格式通過v4l2-ctl --list-devices指令能夠按「哪臺相機」把 /dev/video* 分組列出來從輸出可以看出有三組sunxi代表全志片內的CSI/VIN攝像頭接口ALLwinner Vin代表同一套 VIN 的 媒體控制器節點用來描述內部管線相當于全志這塊 VIN視頻輸入硬件內部怎么接線的說明書在下面的Intel RealSense即表示深度相機設備可以看出其對應的節點。而下面的for.....命令則是對 D415 那幾個節點逐個問「你會什么格式」好從里面挑出彩色口其具體解釋如下for d in /dev/video1 /dev/video2 /dev/video3 /dev/video5 /dev/video6 /dev/video7; do 對列表里每一個路徑把名字存進變量 d循環一遍。這里故意沒寫 video0/4/8/...那些是空的 sunxi-vin。 echo $d 先打印 /dev/video6 這類分隔否則六段輸出會糊成一坨。 v4l2-ctl -d $d --list-formats-ext 2/dev/null | head -n 25 -d $d問當前這個節點 --list-formats-ext格式、分辨率、幀率 2/dev/null報錯不刷屏空節點常有 ioctl 失敗 head -n 25每個節點最多 25 行避免某口分辨率特別多把串口刷爆 done 結束循環。通過輸出可得知各個節點對應的含義其中YUYV代表彩色節點因此/dev/video6即為所要找的彩色節點對應節點含義如下5.輸出彩色畫面目前已經找到了彩色節點下面需要對節點進行讀取操作不同于點燈程序的是相機文件更加復雜節點得到的元數據需要按照對應的協議進行解碼轉換輸出才能最終得到彩色畫面一般來說為了簡便使用可以直接調用GStreamer或者FFmeg框架這些框架內部提供現成的程序幫助直接進行取流轉換操作輸入命令input which gst-launch-1.0 ffplay gst-play-1.0 export XDG_RUNTIME_DIR/var/run output /usr/bin/gst-play-1.0 /usr/bin/gst-launch-1.0用which命令查找是否存在對應框架程序從輸出可看出出廠鏡像帶 GStreamer沒有 ffplay。不必交叉編譯預覽程序。export用于給當前串口會話設環境變量不設的話管道往往取流成功但畫不到 MIPI。不過其只對當前終端有效重開 Xshell 或重啟要再執行一次。找到框架程序后輸入命令input gst-launch-1.0 v4l2src device/dev/video6 ! video/x-raw,formatYUY2,width640,height480,framerate30/1 ! videoconvert ! waylandsink 對應含義 v4l2src device/dev/video6打開彩色口 video/x-raw,formatYUY2,width640,height480,framerate30/1指定 640×48030和 v4l2-ctl 列出的能力一致適合 1024×600 小屏 videoconvert轉格式 waylandsink畫到 Weston/MIPI執行輸入程序后攝像頭打開工作按 Ctrl C停止程序。針對輸入命令的最后一項。“waylandsink畫到 Weston/MIPI”代表通過 Wayland 協議把相機幀交給 Weston再顯示到 MIPI。Weston是這塊板上正在跑的圖形桌面Linux 上應用一般不直接操作屏幕中間有一層「誰在管屏幕」管屏幕的那個進程叫 Weston而Wayland 是一套「應用程序怎么把窗口交給屏幕」的協議。而waylandsink是 GStreamer 里專門把畫面交給Weston的出口插件。前面export XDG_RUNTIME_DIR/var/run設置環境就是為了讓waylandsink能找到Weston的Socket將數據順利傳入進去。不過由于在Xshell一次性粘貼命令時出現了長命令被撕碎的情況且程序運行時反饋刷屏日志因此對輸入命令稍作修改如下intput set H dmesg -n 3 export XDG_RUNTIME_DIR/var/run gst-launch-1.0 v4l2src device/dev/video6 ! videoconvert ! waylandsink fullscreentrue set H 關掉 bash 的歷史展開。否則命令里的 ! 會被當成「重復上一條命令」整句粘壞。只對當前串口會話有效。 dmesg -n 3 把往控制臺打的內核日志壓到級別 3。減輕 crtc 94 刷屏方便看到 GStreamer 自己的字。 export XDG_RUNTIME_DIR/var/run 告訴程序去 /var/run 找 Weston 的 Wayland 套接字。waylandsink 靠這個把窗口交給桌面。重開 Xshell 要再執行一次。