這裡介紹如何使用樹莓派與網路攝影機,自己打造一個物聯網監視器,發現異常狀況時自動以 Email 通報。
使用樹莓派打造具有物聯網功能的監視器的方法與之前介紹過的自製縮時攝影設備類似,主要的技術就是應用 motion
這個工具來處理網路攝影機的畫面,偵測畫面中變動的物體,再配合自己撰寫的通報指令稿,組合成完整的物聯網監視系統。
我把網路攝影機接上曼富圖的桌上型腳架,這樣放在桌上測試比較方便。
motion
是最主要的核心工具,使用 apt 即可安裝。安專之前新更新系統套件資訊:
sudo apt-get update
安裝 motion
套件:
sudo apt-get install motion
motion
在安裝完成之後,預設是不會自動啟動的,要讓它能夠開機自動啟動,就要修改 /etc/default/motion
設定檔,啟用 motion
的 daemon:
start_motion_daemon=yes
接著修改 /etc/motion/motion.conf
設定檔,調整各種 motion
的參數,這裡的參數非常多,這裡只是列出一些我個人感覺比較需要調整的部份。
# 開啟串流與網頁管理功能 stream_localhost off webcontrol_localhost off # 照片解析度 width 1280 height 720 # jpeg 品質 quality 90 # 每秒最高的 frame 數 framerate 4 # 雜訊門檻值 noise_level 64 # 偵測變動像素門檻值 threshold 3000 # 關閉影片輸出 ffmpeg_output_movies off # 標示畫面中有變動的部份 locate_motion_mode on # 用紅色方框標示 locate_motion_style redbox
有些參數必須依照現場的狀況來調整,例如雜訊門檻值(noise_level
)與偵測變動像素門檻值(threshold
),雜訊門檻值是指單一像素值變動多少以上才視為像素變動,而偵測變動像素門檻值是指多少個像素以上的變動才視為有偵測到物體移動,這個會跟鏡頭的好壞、安裝的角度、光線、現場的各種物體有關,要自己去調整。
簡單來說,如果鏡頭品質不好、畫質很差、雜訊很高,那可能就要把雜訊門檻值調高一些,如果是很高級的鏡頭,沒有什麼雜訊的話,就可以把雜訊門檻值降低;如果鏡頭剛好是面對樹葉、窗簾等會飄動的物體,那可能就要把偵測變動像素門檻值調高一些,避免小小的風吹草動就出現警訊,反之若是畫面中的物體都是固定的建築物、道路等,就可以降低偵測變動像素門檻值,讓微小的變動也可以精準偵測出來。
motion
預設也會將變化的畫面以影片檔輸出,但是我怕樹莓派的處理器速度太慢了,所以先把它關掉,只看照片就好。
通常這些數值都要等到實際裝好之後,經過很多次的測試才能得到比較恰當的設定值,所以安裝初期先大約設定一下就可以了。設定好之後,重新啟動 motion
系統服務:
sudo service motion restart
檢查 motion
系統服務的狀態:
service motion status
由於 motion
預設會將圖片與影片的輸出儲存於 /var/lib/motion
中,但是 motion
帳號這個沒有該目錄的寫入權限,我們要自行將這個目錄的擁有者改為 motion
:
sudo chown motion:motion /var/lib/motion
如果權限沒有設定好,會造成 motion
中止執行。
motion
正常執行之後,只要畫面出現變動,就會將變動的畫面儲存下來,下面這張是我拿一顆籃球從鏡頭前滾過去的測試照片,motion
會自動將畫面中有變動的部份用紅色方框標示出來。
這是把所有偵測到變動的照片串起來,製作成的 gif 動畫檔。
這樣就完成基本的 motion
監視系統了,接下來我們要加入事件處理的指令稿,讓系統可以在偵測到畫面變動時,主動發出通知給系統管理者,即時應變處理。
motion
可以在各種事件發生時,執行對應的指令稿,最常見的使用狀況就是當發現變動的畫面時,主動發送 Email 或手機即時訊息,通知系統管理員。我們可以在 /etc/motion/motion.conf
設定檔中指定各種事件所對應的指令稿。
on_picture_save
功能可以指定當圖片存檔後,要呼叫的指令,而這個指令通常會配合 %f
參數一起使用,這個參數代表圖片的絕對路徑,透過這樣的方式即可將圖片傳遞給程式做進一步的處理:
on_picture_save /opt/motion/picture_save.sh %f
這裡我讓 motion
在圖片儲存之後,呼叫我自己寫的 /opt/motion/picture_save.sh
指令稿,並將圖片路徑一起傳過去,而這個指令稿的內容如下:
#!/bin/bash # 名稱:picture_save.sh # 說明:將儲存的照片以 Email 發送 filename=$1 mpack -s "發現變動畫面" $filename guozhao.wang@gmail.com
這個指令稿的內容是將儲存的圖片以 Email 寄送到我的信箱,關於使用樹莓派發送 Email 的方法,請參考 Linux 使用 SSMTP 與 GMail 以指令或程式自動寄信教學。
監視系統的攝影機必須要維持正常運作,這樣整個系統才有作用,on_camera_lost
可以指定當攝影機出問題時所要呼叫的指令。如果一台樹莓派接了好幾台攝影機,可以配合 %t
參數,將出問題的攝影機編號傳遞出來:
on_camera_lost /opt/motion/camera_lost.sh %t
以下是 /opt/motion/camera_lost.sh
指令稿的內容:
#!/bin/bash # 名稱:camera_lost.sh # 說明:攝影機故障通報 camera_number=$1; echo "攝影機 $camera_number 故障" | mail -s "攝影機 $camera_number 故障" guozhao.wang@gmail.com
這個指令稿是將攝影機故障的訊息以 Email 發送至我的信箱。
motion
還有支援其他幾種事件,設定的方式也都類似,請查看 /etc/motion/motion.conf
的註解說明,另外也還有非常多種參數可以使用,其註解中也有詳細的說明。
參考資料:Alex Nikolaidis、motion、Home Automation Community、citrusbyte、The Python Quants