這裡介紹如何使用樹莓派與網路攝影機,自己打造一個物聯網監視器,發現異常狀況時自動以 Email 通報。
使用樹莓派打造具有物聯網功能的監視器的方法與之前介紹過的自製縮時攝影設備類似,主要的技術就是應用 motion
這個工具來處理網路攝影機的畫面,偵測畫面中變動的物體,再配合自己撰寫的通報指令稿,組合成完整的物聯網監視系統。
我這次用的設備是一張樹莓派 Raspberry Pi 2 Model B 開發板加上羅技 Logitech C920R HD PRO 網路攝影機,作業系統是使用樹莓派官方的 Raspbian。
我把網路攝影機接上曼富圖的桌上型腳架,這樣放在桌上測試比較方便。
基本監視系統
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
JC
想請問,樹莓派的金屬外殼從何處購得呢?
謝謝!!
G. T. Wang
在拍賣網站上就可以買到。
WNAG
請問這樣一套成本大概多少錢呢
G. T. Wang
成本計算應該很單純,從網路上就可以查到硬體的價格:
而我這篇的樹莓派外殼是鋁合金的外殼,好久之前買的價格是 640 元。
工錢就自己評估吧。 🙂
elephant
攝影機可以換成camera module就好嗎?
G. T. Wang
可以,只不過 camera module 的安裝與設定方式會有些小差異。
林浩棟
謝謝作者的分享,我照您的步驟再用官方的相機模組試成功了,順便補充用相機模組的方法。
sudo nano /etc/modules
在裡面加一行
bcm2835-v4l2
存檔,重開機就行了。
HuaWei
您好 請問當Pi及主機連接的網路不同時,並不能以主機去觀看到監視的內容,
請問該如何解決當連接不同網路時,無法監控的問題呢?
terry
你好,請問圖片儲存事件中,您提到輸入自己撰寫的指令搞,請問要怎麼自己撰寫指令搞?謝謝
Frankie
您好,關於後續的程式觸發,會顯示無權限
picture_save.sh、camera_lost.sh
請問這樣子該如何賦予它權限?? 我在前面加上sudo反而會變成找不到
(on_picture_save sudo /opt/motion/picture_save.sh %f)
黃姿嬑
您好,
由於敝司今年度欲辦理智慧化居住空間連結"樹莓派連動燈光控制"或是"樹莓派連動監控系統"相關之工作坊。想借重您的知識與經驗,邀請您擔任講師,想請問您是否有合作意願?
如果方便的話,麻煩您撥冗以信件回覆,謝謝。
G. T. Wang
由於我最近都很忙,所以沒辦法參加,抱歉。
Jackson
你好, 想請問一下, motion 是否有功能可以接受 GPS 訊號, 並且把它存到照片資訊去呢?
TIM
我的畫面有東西經過會被標示起來,也有設定圖片儲存事件,但是都沒有圖片被儲存下來是甚麼問題呢?