樹莓派+python+OpenCV等打造智能家居遠程監控系統

樹莓派+python+OpenCV等打造智能家居遠程監控系統

前言

前幾天,在食堂吃飯,本來每天中午的新聞三十分換成了視頻監控。我們已經習慣了,前十分鐘看著領導都很忙,中間十分鐘中國人民都很幸福,後十分鐘別的國家都生活在水深火熱裡,順便跟同事談談國家大事。突然主角換成了我們自己,便毫無抬頭的慾望。

恰巧最近也有在接觸大屏監控的解決方案,於是乎,就索性拿樹莓派實驗了一把,做一個智能監控系統。

軟硬件清單

  • 讀卡器以及 SD 卡(裝系統用)
  • 攝像頭一枚,支持 USB
  • SSH連接工具(SecureCRT,Xshell)
  • 寬帶、路由器(家中常備)
  • 裝好系統的樹莓派 3B+ 一隻(充電器、CPU散熱風扇等)

在開始之前照常先秀一下這半成品的監控系統,是不是醜到爆!?

樹莓派+python+OpenCV等打造智能家居遠程監控系統

監控系統

市面上有很多開源的攝像頭管理軟件,比如 motion、mjpg-streamer,當然我們也可以用 Python 自己實現更智能的監控系統。

下面,我們分別來介紹以上三種方案。

motion

安裝:

  1. sudo apt-get install motion

打開 motion daemon 守護進程,讓他可以一直在後臺運行

  1. sudo vim /etc/default/motion
  2. #no修改成yes:
  3. start_motion_daemon=yes

修改 motion 的配置文件:

  1. sudo vim /etc/motion/motion.conf
  2. #deamon off 改成 on
  3. deamon on
  4. #設置分辨率
  5. width 800
  6. height 600
  7. #關閉 localhost 的限制
  8. stream_localhost off

運行 motion:

  1. sudo motion

停止 motion:

  1. killall motion 或者 service motion stop

現在我們的攝像頭已經變成了一臺網絡攝像頭。在chrome瀏覽器下訪問 http://:8081 即可看到攝像頭當前拍攝的畫面。

不得不說,真的很耗CPU,差不多持續在60%左右,並且有一定的延遲,卡頓特別嚴重。

mjpg-streamer

先安裝依賴:

  1. sudo apt-get install libjpeg8-dev cmake

下載 mjpg-streamer-master 軟件:

  1. wget http://github.com/jacksonliam/mjpg-streamer/archive/master.zip
  2. unzip master.zip
  3. cd mjpg-streamer-master/mjpg-streamer-experimental
  4. # 編輯配置文件
  5. vim plugins/input_raspicam/input_raspicam.c

進去之後搜索fps,也就是按一下/鍵,然後輸入fps,然後回車將fps、高度、寬度修改,參考下圖:

樹莓派+python+OpenCV等打造智能家居遠程監控系統

然後退出到mjpg-streamer-master/mjpg-streamer-experimental路徑,編譯:

  1. sudo make clean all

啟動攝像頭:

  1. //啟動普通 USB攝像頭
  2. ./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"
  3. //啟動樹莓派專用攝像頭
  4. ./mjpg_streamer -i "./input_raspicam.so" -o "./output_http.so -w ./www"
  5. //openwrt下啟動,8090端口
  6. mjpg_streamer -i "input_uvc.so -f 10 -r 320*240" -o "output_http.so -p 8090 -w www"

如果出現以下錯誤:

樹莓派+python+OpenCV等打造智能家居遠程監控系統

多插拔幾次攝像頭興許就可以了。

多參數啟動:

  1. sudo mjpg_streamer -i "./input_uvc.so -r 640x480 -f 10 -n" -o "./output_http.so -p 8080 --w ./www"

密碼訪問

  1. # userid:password 改成自己的就可以
  2. sudo mjpg_streamer -i "./input_uvc.so -r 640x480 -f 10 -n" -o "./output_http.so -p 8080 --w ./www -c userid:password"

在瀏覽器中打開,外網自備穿透:

  1. http://:8080
  2. http://:8080/?action=stream

最終畫面:

樹莓派+python+OpenCV等打造智能家居遠程監控系統

這個就流暢多了,CPU差不多也佔到五六十的樣子,不過無礙,畢竟是4核。

Python 實現

上面兩種方式只能做到瀏覽器監控訪問,非局域網還得搭個穿透才能訪問,看似華麗,其實並沒有實際卵用。

為了更加智能的實現監控告警,下面我們採用Python +OpenCV+Wechat 實現。

樹莓派+python+OpenCV等打造智能家居遠程監控系統

安裝 OpenCV

安裝基礎組件:

  1. sudo apt-get update
  2. sudo apt-get install libjpeg-dev libatlas-base-dev libjpeg-dev libtiff5-dev libpng12-dev libqtgui4 libqt4-test libjasper-dev

然後安裝 OpenCV:

  1. sudo pip3 install opencv-python

一般情況,你是不可能安裝成功的,99.999% 會出現以下錯誤:

  1. Collecting opencv-python
  2. Downloading https://www.piwheels.org/simple/opencv-python/opencv_python-3.4.4.19-cp35-cp35m-linux_armv7l.whl (7.4MB)
  3. 45% |██████████████▍ | 3.3MB 15kB/s eta 0:04:20
  4. THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE. If you have updated the package versions, please update the hashes. Otherwise, examine the package contents carefully; someone may have tampered with them.
  5. opencv-python from https://www.piwheels.org/simple/opencv-python/opencv_python-3.4.4.19-cp35-cp35m-linux_armv7l.whl#sha256=329d9d9fdd62b93d44a485aeaab4602c6f5b8555ea8bcc7dbcdc62c90cfe2c3f:
  6. Expected sha256 329d9d9fdd62b93d44a485aeaab4602c6f5b8555ea8bcc7dbcdc62c90cfe2c3f
  7. Got 869c7994c40b84ac09f244f768db9269d52d3265d376441e8516a47f24711ef2

這可能是由於網速太慢了,沒有下載完整的文件,所以不完整的文件的md5和期望的不一樣。

我們首先下載 whl 文件到本地:

  1. # 瀏覽器直接訪問就可以
  2. https://www.piwheels.org/simple/opencv-python/opencv_python-3.4.4.19-cp35-cp35m-linux_armv7l.whl

然後上傳到樹莓派,使用以下命令安裝:

  1. sudo pip3 install opencv_python-3.4.4.19-cp35-cp35m-linux_armv7l.whl

如果出現以下代碼,說明安裝成功:

  1. Processing ./opencv_python-3.4.4.19-cp35-cp35m-linux_armv7l.whl
  2. Requirement already satisfied: numpy>=1.12.1 in /usr/lib/python3/dist-packages (from opencv-python==3.4.4.19)
  3. Installing collected packages: opencv-python
  4. Successfully installed opencv-python-3.4.4.19

智能監控主要代碼:

  1. # -*- coding: utf-8 -*-
  2. # import 進openCV的庫
  3. import cv2
  4. import os
  5. import time
  6. from wxpy import *
  7. """
  8. 樹莓派打造智能看門狗
  9. sudo pip3 install opencv-python
  10. sudo pip3 install wechat_sender
  11. """
  12. # 登錄微信
  13. bot = Bot()
  14. my_friend = bot.friends().search('監控狗')[0]
  15. # 調用攝像頭檢測人臉並截圖
  16. def camera(window_name, path_name):
  17. # Linux 不顯示圖形界面
  18. # cv2.namedWindow(window_name)
  19. # 視頻來源,來自USB攝像頭
  20. cap = cv2.VideoCapture(0)
  21. # 告訴OpenCV使用人臉識別分類器
  22. classfier = cv2.CascadeClassifier(os.getcwd()+"/haarcascade/haarcascade_frontalface_alt.xml")
  23. # 識別出人臉後要畫的邊框的顏色,RGB格式, color是一個不可增刪的數組
  24. color = (0, 255, 0)
  25. num = 0
  26. while cap.isOpened():
  27. ok, frame = cap.read() # 讀取一幀數據
  28. if not ok:
  29. break
  30. # 將當前楨圖像轉換成灰度圖像
  31. grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  32. # 人臉檢測,1.2和2分別為圖片縮放比例和需要檢測的有效點數
  33. faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
  34. if len(faceRects) > 0: # 大於0則檢測到人臉
  35. for faceRect in faceRects: # 單獨框出每一張人臉
  36. x, y, w, h = faceRect
  37. num = num+1
  38. # 將當前幀保存為圖片
  39. img_name = "%s/%d.jpg" % (path_name, num)
  40. image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
  41. cv2.imwrite(img_name, image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
  42. print("有人來了~~~")
  43. alarm(num)
  44. # 延遲 60s,不要太頻繁的發送,知道來了就可以了
  45. time.sleep(60)
  46. # 畫出矩形框
  47. cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
  48. # 顯示當前捕捉到了多少人臉圖片了
  49. font = cv2.FONT_HERSHEY_SIMPLEX
  50. cv2.putText(frame, 'num:%d/1000' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4)
  51. # 顯示圖像 Linux 下注釋掉即可
  52. # cv2.imshow(window_name, frame)
  53. c = cv2.waitKey(10)
  54. if c & 0xFF == ord('q'):
  55. break
  56. # 釋放攝像頭並銷燬所有窗口
  57. cap.release()
  58. cv2.destroyAllWindows()
  59. def alarm(num):
  60. my_friend.send('有人闖進臥室了!')
  61. my_friend.send_image(os.getcwd()+"/dog/"+str(num)+".jpg")
  62. if __name__ == '__main__':
  63. camera("watchdog", os.getcwd()+"/dog")

運行腳本,系統會自動生成一個二維碼,使用微信掃描登錄即可:

  1. python3 watchdog.py

然後,把你的狗頭對準攝像頭,神奇的事情就這麼發生了。

樹莓派+python+OpenCV等打造智能家居遠程監控系統

有點小遺憾的是,啟動腳本後,Python 進程 CPU 佔用率居然高達300+,平均每個 CPU 差不多80+的樣子,心疼我的小風扇一秒鐘。

小結

如果你比較追求精緻,還是不要這麼搞了,這套方案離小米網絡監控視攝像頭功能差遠了,到手價只要189,而一個樹莓派的板子就 200+。

如果你喜歡瞎折騰,還是蠻好的,不僅能學到知識,還能體會到其中的樂趣,最重要的是可以隨心所欲的接入可以實現的任何功能。


分享到:


相關文章: