logo
Loading...

03 - 攝影機影像與控制儲存 - AIOT 邊緣運算工作坊 - Cupoy

知識地圖 – Raspberry PI 介紹 重要知識點 video4Linux 媒體裝置存取檔案架構 WebCam 作為 Linux 週邊裝置存取方式 fswebcam 介紹 fswe...

知識地圖 – Raspberry PI 介紹 重要知識點 video4Linux 媒體裝置存取檔案架構 WebCam 作為 Linux 週邊裝置存取方式 fswebcam 介紹 fswebcam 安裝與使用介紹 透過 Python 呼叫 fswebcam 進行 WebCam 操控 讓 WebCam 拍一張相片,並且儲存 Video4Linux 介紹 Video4Linux(V4L) 是視訊擷取及裝置輸出的 API,以及 Linux 的驅動程式框架,支援很多 USB 網路攝影機、影像擷取裝置與其他裝置,如影片監控軟體、webcam 控制與資料讀取,同時也常使用在 linux 嵌入系統的開發環境。 Video4Linux 常見支援的軟體有,Ffmpeg、FreeJ、Gstreamer、Mplayer、OpenCV、Skype、VLC 多媒體播放器等。 V4L 分為兩層架構,底層為影音設備在核心中的驅動程式,上層為系統提供的 API,希望能達成讓程式開發人員透過核心所提供的 API,控製影片和音頻設備,這樣的好處是對程式開發人員只需要學習系統 API 就可以控制不同類型的影音設備。 補充資料:raspberry-gpio-python Video4Linux 框架簡介 當 /dev 內有某個檔案名稱出現時,代表作業系統與外部周邊裝置使用某一個方式來進行資料的存取。 視頻擷取/輸出(/dev/videoX) 編碼/解碼器(/dev/videoX,streaming 和控制) 原始和切割 VBI 擷取與輸出(/dev/vbiX,streaming 和控制) 無線電調諧和調製(/dev/radioX,控制,ALSA 傳輸) RDS 接收器/發射器(/dev/radioX,AM and FM (analog) radio 接收以傳送) 軟體定義無線電(/dev/swradioX, Software Defined Radio tuners ) 低級別子設備控制(/dev/v4l-subdevX,控制) 設備拓撲發現/控制(/dev/mediaX,控制) 觸控裝置: ( /dev/v4l-touchX,觸控感測器 ) 橋驅動控制的 DMA 傳輸 / USB / PCI 等硬體,電路板配置(USB ID,PCI ID,內核配置,Device Tree,模塊選項),掛載必要子設備驅動程序,註冊橋驅動程序需要的設備節點。 video4Linux2 內含於 Linux 核心 在 Linux 系統中各種設備,本質上都是用檔案形式來存取使用,在 Linux 中各種外部設備的使用,於 dev 目錄下,如果它們已經正確的被驅動,在之後寫程式存取與控制時,基本上與檔案操作的觀念,本質上是沒有什麽區別的。 V4L2(Video4Linux 2nd)是一套 Linux 針對視訊設備(例如 Webcam)所定義好的 Userspace API,因此硬體廠商只要能實做 API 的功能,就能讓使用者透過統一的介面控制硬體。如此一來上層的使用者就即使不知道硬體的廠牌與底層的實做方法,只要知道呼叫相同的函式就能得到相同的結果。 安裝 v4l2 模組,以 python 存取 video4Linux 官方的下載網址是:https://pypi.org/project/v4l2/。 python3 內建的安裝命令是 pip3 install v4l2,在實際操作的過程中,會發現官方提供的 v4l2 版本在 python3 匯入時會發生錯誤。 目前可以透過以下的指令下載與安裝修正過的 v4l2 模組。 UVC 介紹 USB video class(又稱為USB video device class or UVC),目的是提供視訊產品不需要安裝任何驅動程式下即插即用,包括網路攝影機(Webcam)、數位攝影機(Digital Camcorders)、類比影像轉換器(Transcoders)、電視卡(TV Receiver Card)等。 在 Linux 上如果有一個支援 UVC 的 Webcam 插到 USB,就會向 Kernel 註冊為 Webcam 設備,裝置節點為 /dev/videoX。 最新的 UVC 版本為 UVC 1.5,由 USB-IF(USB Implementers Forum)定義包括基本協議及負載格式。 簡單的說 V4L2 就是用來管理 UVC 裝置,提供視訊 API。 補充資料:Linux下Camera程式設計–V4L2 UVC 裝置查詢 UVC 視訊顯示需要滿足三個條件: UVC 的 Camera 硬體支援 UVC 驅動程式支援,包括 USB 裝置驅動以及 V4L2 的支援 應用程式支援 Linux UVC 驅動程式為了全面支援 UVC 裝置,視訊裝置或 USB 視訊定義視訊串流,UVC 只需通用驅動支援就能正常工作,就像 USB 大容量儲存裝置一樣。 判斷視訊裝置是否支援 UVC 規格的方法: 使用 lsusb 命令或其他硬體資訊檢視工具,找出視訊裝置的裝置標號(Vendor ID)和產品號(Product ID)。 查詢是否有視訊周邊裝置的資訊,使用下面的指令 lsusb -v | grep “14 Video” 如果相容 UVC,則會輸出類似資訊 bFunctionClass 14 Video bInterfaceClass 14 Video 如果沒有以上資訊,則是沒有支援 UVC 的裝置(non-UVC)。 取得 webcam 支援的擷取解析度 取得連接 webcam 支援擷取解析度與 frame rate v4l2-ctl --list-formats-ext -d /dev/video0 fswebcam 介紹與安裝 fswebcam 可以從這裡下載,有原始碼與相關的參數,webcam 擷取產生影像,由 GD 繪圖函式庫繪製減少雜訊的影像。 http://www.sanslogic.co.uk/fswebcam/ https://github.com/fsphil/fswebcam fswebcamfswebcam 的安裝方式: sudo apt install fswebcam 要拍照片最簡單的方法: fswebcam image.jpg 設定影像擷取的解析度為 640x360,忽略前面 10 張影像,由 /dev/video0 的裝置取得資料,儲存在 webcam.jpg fswebcam -r 640x360 -S 10 -d /dev/video0 webcam.jpg fswebcam 擷取影像,參數範例 Fswebcam 可以用來做背景執行,或者也可以透過 crontab 設定定時的執行來執行固定時間的拍照動作,可以將參數設定寫在檔案裏面,執行 fswebcam 的時候,使用指令: fswebcam –c fs.conf # fs.conf 內容是 fswebcam 執行時所設定的參數 fs.conf 的範例 device /dev/video0       #使用第一個webcam loop 15                           #每隔15張執行一次擷取 skip 10                            #忽略前面10張不要使用 Invert                              #儲存的影像像素反轉 (變成負片) background                   #使用背景執行 resolution 1920x1080     #擷取的解析度設定為1920x1080 (需要查詢 webcam 可以支援的解析度) set brightness=50%        #亮度調整為50% set contrast=30%            #對比度30% top-banner                       #將文字標題列放置在頂端 (共有no-banner, top-banner, bottom-banner等設定) font /usr/share/fonts/truetype/msttcorefonts/arial.ttf:64       #使用的字型:字型大小 (font:size) title “AIOT-Demo“            #標題內容 timestamp “%d-%m-%Y %H:%M:%S (%Z)“        #時間格式 %d:日期, %m:月份, %Y:年, %H:小時, %M: 分, %S: 秒, %Z: 時區 jpeg 95                              #jpeg壓縮率 (另外有png 可以選擇) greyscale                          #儲存灰階檔案,將彩色轉換成灰階 save /video/avi/%H-%M-%S-viewcam.jpg        #儲存的檔案路徑與檔案名稱,%H-%M-%S-viewcam.jpg是檔案名稱 使用 python 執行 fswebcam 透過 python 呼叫外部指令的做法,可以簡單的透過 fswebcam 每隔一個時間區段,透過攝影機拍照取得影像,fswebcam 執行方式與前面介紹的方式相同。範例程式如下: 知識點回顧 video4Linux 對於使用者使用各種媒體設備,提供非常方便的開始與使用的介面,當電腦插上 webcam 以後,可以觀察 /dev/video* 的變化。 透過 lsusb 的指令可以很容易的觀察支援 UVC 的周邊裝置,使用 lsusb -v | grep “14 Video”,查看影像相關的設備。 fswebcam 提供清楚簡易的操作命列格式,透過 fswebcam 可以將擷取的影像透過命令參數執行灰階、縮放、調整亮度、對比度、負片、時間戳記影像格式、設定影樣標題文字與時間等功能。 透過 python 外部命令執行 fswebcam,可簡易的擷取 webcam 的影像後續再透過 python 程式處理。 作業 請參閱作業範例 : 作業1 : 執行 lsusb -v 指令,觀察系統顯示的 usb 裝置,透過 grep “14 Video” 指令篩選顯示的結果,了解 webcam 裝置在系統層次支援的狀態。 作業2 : 安裝 fswebcam,執行 fswebcam 拍一張照片,確定 webcam 動作正常,並且透過更改參數與設定參數檔案的方式,執行fswebcam,確定可以產生隨時間依序儲存的檔案。 作業3 :透過 python 呼叫 fswebcam,觀察 python 呼叫 fswebcam 執行外部參數的方式,並且練習更改 fswebcam 的參數檔案,不更動 python 程式碼的方式,儲存各種類型的拍照結果。 參考資料 Linux 下 Camera 程式設計 – V4L2 linux UVC 驅動是為了全面的支援 UVC 裝置。它包括 V4L2 核心驅動程式和使用者空間工具補丁。這個視訊裝置或者 USB 視訊類的 USB 裝置類的定義定義了在 USB 上的視訊流的功能。UVC 型別使得只需要一個通用的驅動支援就能夠正常工作,就像 USB 大容量儲存裝置一樣。  UVC 的 linux kernel 驅動程式和支援的硬體裝置相關的描述在這裡:http://www.ideasonboard.org/uvc/。 fsphil / fswebcam fswebcam - Small and simple webcam software for *nix. fswebcam 是一個簡潔明了的網絡攝像頭應用程序。它從兼容 V4L1 / V4L2 的設備或文件中擷取影像,對其進行平均以減少噪聲,並使用 GD 圖形庫繪製標題,該庫還可以將圖像壓縮為 PNG 或JPEG。生成的圖像將保存到文件或發送到標準輸出入裝置(stdio),之後可以透過管線將其傳輸到 ncftp 或 scp 之類的程式,進行後續的處理。