[DIY] 樹莓派 Raspberry Pi 自製智慧型監視器,自動遠端通報系統

羅技 Logitech C920R HD PRO 網路攝影機與樹莓派

這裡介紹如何使用樹莓派與網路攝影機,自己打造一個物聯網監視器,發現異常狀況時自動以 Email 通報。

使用樹莓派打造具有物聯網功能的監視器的方法與之前介紹過的自製縮時攝影設備類似,主要的技術就是應用 motion 這個工具來處理網路攝影機的畫面,偵測畫面中變動的物體,再配合自己撰寫的通報指令稿,組合成完整的物聯網監視系統。


我這次用的設備是一張樹莓派 Raspberry Pi 2 Model B 開發板加上羅技 Logitech C920R HD PRO 網路攝影機,作業系統是使用樹莓派官方的 Raspbian。

羅技 Logitech C920R HD PRO 網路攝影機與樹莓派

我把網路攝影機接上曼富圖的桌上型腳架,這樣放在桌上測試比較方便。

基本監視系統

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 正常執行之後,只要畫面出現變動,就會將變動的畫面儲存下來,下面這張是我拿一顆籃球從鏡頭前滾過去的測試照片,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 以指令或程式自動寄信教學

發現變動畫面 Email 通知

攝影機故障事件

監視系統的攝影機必須要維持正常運作,這樣整個系統才有作用,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 發送至我的信箱。

攝影機故障 Email 通知

motion 還有支援其他幾種事件,設定的方式也都類似,請查看 /etc/motion/motion.conf 的註解說明,另外也還有非常多種參數可以使用,其註解中也有詳細的說明。

參考資料:Alex NikolaidismotionHome Automation CommunitycitrusbyteThe Python Quants

樹莓派, 物聯網

14 留言

  1. JC

    想請問,樹莓派的金屬外殼從何處購得呢?
    謝謝!!

    • G. T. Wang

      在拍賣網站上就可以買到。

  2. WNAG

    請問這樣一套成本大概多少錢呢

  3. elephant

    攝影機可以換成camera module就好嗎?

    • G. T. Wang

      可以,只不過 camera module 的安裝與設定方式會有些小差異。

    • 林浩棟

      謝謝作者的分享,我照您的步驟再用官方的相機模組試成功了,順便補充用相機模組的方法。
      sudo nano /etc/modules
      在裡面加一行
      bcm2835-v4l2
      存檔,重開機就行了。

  4. HuaWei

    您好 請問當Pi及主機連接的網路不同時,並不能以主機去觀看到監視的內容,
    請問該如何解決當連接不同網路時,無法監控的問題呢?

  5. terry

    你好,請問圖片儲存事件中,您提到輸入自己撰寫的指令搞,請問要怎麼自己撰寫指令搞?謝謝

  6. Frankie

    您好,關於後續的程式觸發,會顯示無權限
    picture_save.sh、camera_lost.sh
    請問這樣子該如何賦予它權限?? 我在前面加上sudo反而會變成找不到
    (on_picture_save sudo /opt/motion/picture_save.sh %f)

  7. 您好,

    由於敝司今年度欲辦理智慧化居住空間連結"樹莓派連動燈光控制"或是"樹莓派連動監控系統"相關之工作坊。想借重您的知識與經驗,邀請您擔任講師,想請問您是否有合作意願?

    如果方便的話,麻煩您撥冗以信件回覆,謝謝。

    • G. T. Wang

      由於我最近都很忙,所以沒辦法參加,抱歉。

  8. Jackson

    你好, 想請問一下, motion 是否有功能可以接受 GPS 訊號, 並且把它存到照片資訊去呢?

  9. TIM

    我的畫面有東西經過會被標示起來,也有設定圖片儲存事件,但是都沒有圖片被儲存下來是甚麼問題呢?

Comments are Closed