|

【Open Source】用libcamera函式庫操控樹莓派攝影機

   

作者:陸向陽

樹莓派第三代攝影機模組(左)與第三代廣角鏡攝影機模組(右)(圖片來源:樹莓派官網

libcamera是什麼?它是兩個字的合寫,一是函式庫library的簡稱lib,另一是攝影機的camera(或稱影像感測器image sensor)。它是一套開放原始程式碼的函式庫,最初是Nokia為了開發Linux智慧手機而配套發展的軟體,之後Nokia取消這個開發計畫,然軟體被接續發展至今。

libcamera可以用在各種Linux相關的作業系統上,如Android、ChromeOS、Linux等,用其來設定、操控攝影機,因此也能用來操控樹莓派(Raspberry Pi)官方的攝影機模組(Camera Module),畢竟樹莓派也是跑Linux的。

樹莓派攝影機模組已經是第三代了,第一代是2013年推出,只有500萬畫素,之後2016年推出800萬畫素的第二代,今(2023)年則推出第三代,並把畫素拉高到1,200萬,第三代發表後第一代也就不再供貨。

如何使用

用libcamera操控攝影機是透過命令列(command line)方式達到的,例如最簡單是先打libcamera-hello(類似一般寫程式的Hello World),就可以看到5秒的鏡頭畫面預覽。

或者可以用libcamera-jpeg來要求攝影機捕捉畫面,並以 .jpg格式存檔,例如打libcamera-jpeg -o test.jpg就會把影像捕捉後輸出(Output, 參數o的由來)成一個test.jpg圖檔。類似的,libcamera-still也是捕捉靜態畫面用的命令,但比較能支援舊版的相關參數選項。

或者還有libcamera-raw指令,能運用攝影機最原生的規格來錄影,不過錄的過程中不會同步顯示預覽畫面,典型的使用方式如libcamera-raw -t 2000 -o test.raw,是指連續錄2秒鐘,並以test.raw為檔名存下錄影的內容;或者還有libcamera-detect指令,一般在Raspberry Pi OS下沒有這個指令,主要是搭配TensorFlow Lite一起使用。

在各種操作設定中,libcamera-vid可能是最為常用且好用的,vid估計是video的簡稱,libcamera-vid是用於一般錄影用的,用它來錄影可以啟動樹莓派主控晶片內的H.264硬體編碼器,可以更快速、順暢且省電的方式進行錄影。

libcamera-vid預設是使用640 x 480解析度,但可以手動指定解析度,例如要以Full HD解析度錄影,命令可以下libcamera-vid –width 1920 –height 1080 -o

full_hd.h264,這樣就可以將錄影內容以full_hd.h264的檔名存下來,編碼格式為H.264。

如果還要指定每秒的錄製畫面張數(framerate),或稱畫面更新率,對岸稱為幀率,也可以加上–framerate 50,50是指每秒50張,數字可以依需要調整。

進一步的也可以調整位元率(bitrate),參數可以下–bitrate或-b都可以,例如libcamera-vid -b 1000000 –width 1920 –height 1080 -o test.h264這段指令是指使用1920 x 1080解析度錄影,位元率為1Mbps,即命令列中的數字1000000。若是把數字調高,從1000000增加到5000000、9000000等,則錄下來的畫質比較好。

除了H.264格式外其實也可以用MJPEG來錄製,命令libcamera -t 20000 –codec mjpeg -o test.mjpeg即表示錄2秒然後以test.mjpeg檔名儲存,錄影的編碼格式為MJPEG。這裡要注意,單純指定檔名為 .mjpeg但卻沒有加–codec參數其實是無效的,一定要加。

不僅錄影可能還需要同步錄音,這時得幫樹莓派裝上麥克風,然後透過另外一個函式庫的協助來完成,一樣要下codec參數,命令為libcamera-vid –codec libav –libav-audio -o test.mp4,這裡即呼叫了前面純錄影時沒用到的libav函式庫。

到這裡可能還有個疑問:開始錄製後該如何停止嗎?很簡單,使用鍵盤組合鍵Ctrl+C即可,要恢復繼續錄就重新下一次命令。或者,也可以用–timeout參數來預先設定錄影時間,最小單位為1毫秒,如果下–timeout 1000就是錄製一秒的意思。

第三代模組參數設定

接下來要啟用第三代攝影模組的特有功能,如自動對焦、高動態範圍等,自動對焦要使用到–lens-position(鏡頭位置)參數,參數值是焦距的倒數,類似屈光率,如果數值是10,則1/10是0.1,表示焦距位置為0.1公尺;如果數值是0.5,則1/0.5為2,表示焦距位置為2公尺,範例命令如libcamera-vid –lens-position 0.5 -o test.h264(鏡頭焦距放在2公尺位置)

樹莓派第三代攝影鏡頭的四種類型(圖片來源:樹莓派官網

至於要啟用高動態範圍功能,就只要下–hdr參數(即high dynamic range)即可,不需要搭配數值,例如libcamera-vid –hdr -o test.h264

要注意的是,啟用高動態範圍就無法使用鏡頭原有的最高解析度(4608 x 2592),必須在長寬解析度都打對折(2304 x 1296)。不過,若最後選擇用H.264格式儲存影像,由於H.264格式最高到1920 x 1080,所以開啟與不開啟的解析度改變幾乎沒有差別。

結語

有關libcamera的參數還非常多,例如可以用串流方式輸出視訊畫面,或設定以時間為單位把原本該連續錄製的影像檔案自動切割、編號儲存,更多參數有待創客們親自去嘗試、摸索、體驗。

有支講解影片(英文)來推薦如下:

陸向陽
陸向陽

Author: 陸向陽

從電子科系畢業後,即以媒體人的角色繼續這段與「電子科技」的不解之緣。歷任電子技術專書作者、電子媒體記者、分析師等角色,並持續寫作不殆。近來投入Arduino、Raspberry Pi等開放硬體的研究與教程介紹。

Share This Post On

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *