縮時攝影是一個很有趣的應用,可以把原本需要長時間才能觀察到的現象,在很短的時間內就呈現出來。例如種子的生長,不再需要花費數天的觀察,可能只要數分鐘就可以發芽、成長。在這篇文章中,我們將透過 Python 程式控制 Raspberry Pi 上的 USB Webcam 進行縮時攝影,並在最後產生一個 mp4 格式的影像檔。

縮時攝影

一直以來我們所觀看的影片,不管是卡通、傳統影片、到最新的數位影片,基本上都是由一張一張的畫面所組合。舉例來說,當我們使用手機進行錄影時,其實就是以每秒固定幾個畫面的速度不斷地拍照,然後將這些抓下來的畫面使用影片格式 (而不是原本照片的格式) 加以儲存。至於每秒固定抓幾個畫面,有個專有名詞叫做 fps,英文全名是 frame per second。舉例來說,如果是 30fps 就表示每秒鐘會抓 30 張畫面。而當我們事後要觀看這段影片時,也必須用同樣的 fps 加以播放,不然看影片時所經過的時間就會跟原本的時間不一樣。同樣以 30fps 錄製的影片來說,如果我們用 15fps 的速度加以撥放,每秒鐘顯示的畫面減少一半,也就是顯示原本的全部畫面需要兩倍時間,因此影片中的所有東西看起來就會變成慢動作。相反的,如果用 60fps 的速度加以撥放,所有東西就都變成快動作了。

而縮時攝影的概念就跟提高播放時的 fps 一樣,可以讓所有的東西都變成快動作。但是縮時攝影的快動作通常可不是幾倍這個小把戲,而是數千倍、甚至更高,所以在製作上,通常並不是先拍攝一段影片後再調高撥放時的 fps。縮時攝影比較像是傳統卡通的作法,畫家畫出一張一張的圖片,然後再把這些圖片連續撥放出來而變成影片。而這位畫家,在縮時攝影中當然就是我們的攝影機,透過拍照功能畫下一張又一張的圖片。當取得足夠的畫面後,再將這些畫面重組成可以撥放的影片。此外,因為通常很久才拍攝一張畫面,所以也不用 fps 當作計算的單位,而是多久拍攝一張,如 10 秒鐘拍攝一張。

Raspberry Pi 的縮時攝影

前面提到 Raspberry Pi 有官方出版的攝影機,其抓取畫面的指令列工具 raspistill 也提供了支援縮時攝影的參數,可以在一段時間內不斷地定時拍照。很可惜的是 raspistill 目前只支援官方的攝影機,並不支援 USB Webcam,所以接下來我們利用自己開發的 Python 程式來達到類似的功能。

環境建置

  1. 選取 Terminal 應用程式
    Raspberry Pi Terminal 應用程式
  2. 安裝影片製作套件 gstreamer

程式代碼

利用文字編輯器 (如 nano) 新增 Python 程式 usb_webcam_timelapse.py

內容如下

程式說明如下:

  1. 第 1~3 行引入程式所用到的 Python 基本套件。
  2. 第 5~11 行透過 argparse 套件取得命令列參數,讓我們可以在呼叫 usb_webcam_timelapse.py 時可以指定畫面的寬度 (變數 width)、長度 (變數
    height)、圖片與影片的儲存目錄 (變數 output)、抓取畫面的間隔時間 (變數 timelapse)、總共需要抓取多少畫面 (變數 count)。
  3. 第 13~17 行設定上述變數的預設值。
  4. 第 18~27 行判斷我們是否有指定命令列參數,如果有指定的話,就將變數改成我們所指定的數值。需要注意的是,命令列參數所取得的數值都是字串的格式,因此針對數字類型的變數 (如 width) 必須經由 int() 函式轉換成數字後才可以加以使用。
  5. 第 32~37 行重複透過我們之前用過的 fswebcam 指令抓取畫面,直到抓取足夠的張數。
  6. 第 38 行提供使用者提前結束抓取畫面的選擇,使用者按下 Ctrl-C 就可以停止重複抓取的動作。
  7. 第 41~42 行利用 gstreamer 將抓取的畫面全部匯入至 timelapse.mp4 這個檔案。
  8. 第 41 行指定輸出的影片為 30fps。如果程式每 10 秒抓取一張畫面,一秒鐘的影片就等於真實世界已經過了 30×10 = 300 秒鐘,也就是快了 300 倍。
  9. 除了 gstreamer 外,avconv 套件也可以用來將畫面轉換成影片。

程式完成後,輸入下列指令執行程式

程式執行後就會開始每隔 5 秒鐘抓取一張大小為 1920×1080 的畫面,直到抓取 1000 張畫面為止,而且所有的畫面與最後的影片都會存放在 /tmp/tl 這個目錄下。因為每次輸出的畫面圖片都會從 1 開始編號,所以每次重新執行前記得要先將輸入目錄下的檔案清空,以免新舊圖檔混在一起而造成最後影片的不正常顯示。

透過我們自己撰寫的 python 程式就可以利用 Raspberry Pi 的 USB Webcam 進行縮時攝影,並在最後轉換成可直接播放的影片,使用起來甚至比 raspistill 更為方便。

如果對文章的內容有任何疑問或建議,歡迎與我聯絡。

Facebook 留言
Print Friendly, PDF & Email