前幾天,在食堂吃飯,原本天天中午的新聞三十分換成了視頻監控。咱們已經習慣了,前十分鐘看着領導都很忙,中間十分鐘中國人民都很幸福,後十分鐘別的國家都生活在水深火熱裏,順便跟同事談談國家大事。忽然主角換成了咱們本身,便毫無擡頭的慾望。python
恰巧最近也有在接觸大屏監控的解決方案,因而乎,就索性拿樹莓派實驗了一把,作一個智能監控系統。linux
在開始以前照常先秀一下這半成品的監控系統,是否是醜到爆!?git
市面上有不少開源的攝像頭管理軟件,好比 motion、mjpg-streamer,固然咱們也能夠用 Python 本身實現更智能的監控系統。github
下面,咱們分別來介紹以上三種方案。chrome
安裝:shell
sudo apt-get install motion
打開 motion daemon 守護進程,讓他能夠一直在後臺運行vim
sudo vim /etc/default/motion #no修改爲yes: start_motion_daemon=yes
修改 motion 的配置文件:數組
sudo vim /etc/motion/motion.conf #deamon off 改爲 on deamon on #設置分辨率 width 800 height 600 #關閉 localhost 的限制 stream_localhost off
運行 motion:瀏覽器
sudo motion
中止motion:微信
killall motion 或者 service motion stop
如今咱們的攝像頭已經變成了一臺網絡攝像頭。在chrome瀏覽器下訪問 http:// <樹莓派ip> :8081 便可看到攝像頭當前拍攝的畫面。
不得不說,真的很耗CPU,差很少持續在60%左右,而且有必定的延遲,卡頓特別嚴重。
先安裝依賴:
sudo apt-get install libjpeg8-dev cmake
下載 mjpg-streamer-master 軟件:
wget http://github.com/jacksonliam/mjpg-streamer/archive/master.zip unzip master.zip cd mjpg-streamer-master/mjpg-streamer-experimental # 編輯配置文件 vim plugins/input_raspicam/input_raspicam.c
進去以後搜索fps,也就是按一下/鍵,而後輸入fps,而後回車將fps、高度、寬度修改,參考下圖:
而後退出到mjpg-streamer-master/mjpg-streamer-experimental路徑,編譯:
sudo make clean all
啓動攝像頭:
//啓動普通 USB攝像頭 ./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www" //啓動樹莓派專用攝像頭 ./mjpg_streamer -i "./input_raspicam.so" -o "./output_http.so -w ./www" //openwrt下啓動,8090端口 mjpg_streamer -i "input_uvc.so -f 10 -r 320*240" -o "output_http.so -p 8090 -w www"
若是出現如下錯誤:
多插拔幾回攝像頭興許就能夠了。
多參數啓動:
sudo mjpg_streamer -i "./input_uvc.so -r 640x480 -f 10 -n" -o "./output_http.so -p 8080 --w ./www"
# 密碼訪問 userid:password 改爲本身的就能夠 sudo mjpg_streamer -i "./input_uvc.so -r 640x480 -f 10 -n" -o "./output_http.so -p 8080 --w ./www -c userid:password"
在瀏覽器中打開,外網自備穿透:
http://<樹莓派IP>:8080 http://<樹莓派IP>:8080/?action=stream
最終畫面:
這個就流暢多了,CPU差很少也佔到五六十的樣子,不過無礙,畢竟是4核。
上面兩種方式只能作到瀏覽器監控訪問,非局域網還得搭個穿透才能訪問,看似華麗,其實並無實際卵用。
爲了更加智能的實現監控告警,下面咱們採用Python +OpenCV+Wechat 實現。
安裝基礎組件:
sudo apt-get update sudo apt-get install libjpeg-dev libatlas-base-dev libjpeg-dev libtiff5-dev libpng12-dev libqtgui4 libqt4-test libjasper-dev
而後安裝 OpenCV:
sudo pip3 install opencv-python
通常狀況,你是不可能安裝成功的,99.999% 會出現如下錯誤:
Collecting opencv-python Downloading https://www.piwheels.org/simple/opencv-python/opencv_python-3.4.4.19-cp35-cp35m-linux_armv7l.whl (7.4MB) 45% |██████████████▍ | 3.3MB 15kB/s eta 0:04:20 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. opencv-python from https://www.piwheels.org/simple/opencv-python/opencv_python-3.4.4.19-cp35-cp35m-linux_armv7l.whl#sha256=329d9d9fdd62b93d44a485aeaab4602c6f5b8555ea8bcc7dbcdc62c90cfe2c3f: Expected sha256 329d9d9fdd62b93d44a485aeaab4602c6f5b8555ea8bcc7dbcdc62c90cfe2c3f Got 869c7994c40b84ac09f244f768db9269d52d3265d376441e8516a47f24711ef2
這多是因爲網速太慢了,沒有下載完整的文件,因此不完整的文件的md5和指望的不同。
咱們首先下載 whl 文件到本地:
# 瀏覽器直接訪問就能夠 https://www.piwheels.org/simple/opencv-python/opencv_python-3.4.4.19-cp35-cp35m-linux_armv7l.whl
而後上傳到樹莓派,使用如下命令安裝:
sudo pip3 install opencv_python-3.4.4.19-cp35-cp35m-linux_armv7l.whl
若是出現如下代碼,說明安裝成功:
Processing ./opencv_python-3.4.4.19-cp35-cp35m-linux_armv7l.whl Requirement already satisfied: numpy>=1.12.1 in /usr/lib/python3/dist-packages (from opencv-python==3.4.4.19) Installing collected packages: opencv-python Successfully installed opencv-python-3.4.4.19
智能監控主要代碼:
# -*- coding: utf-8 -*- # import 進openCV的庫 import cv2 import os import time from wxpy import * """ 樹莓派打造智能看門狗 sudo pip3 install opencv-python sudo pip3 install wechat_sender """ # 登陸微信 bot = Bot() my_friend = bot.friends().search('監控狗')[0] # 調用攝像頭檢測人臉並截圖 def camera(window_name, path_name): # Linux 不顯示圖形界面 # cv2.namedWindow(window_name) # 視頻來源,來自USB攝像頭 cap = cv2.VideoCapture(0) # 告訴OpenCV使用人臉識別分類器 classfier = cv2.CascadeClassifier(os.getcwd()+"/haarcascade/haarcascade_frontalface_alt.xml") # 識別出人臉後要畫的邊框的顏色,RGB格式, color是一個不可增刪的數組 color = (0, 255, 0) num = 0 while cap.isOpened(): ok, frame = cap.read() # 讀取一幀數據 if not ok: break # 將當前楨圖像轉換成灰度圖像 grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 人臉檢測,1.2和2分別爲圖片縮放比例和須要檢測的有效點數 faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32)) if len(faceRects) > 0: # 大於0則檢測到人臉 for faceRect in faceRects: # 單獨框出每一張人臉 x, y, w, h = faceRect num = num+1 # 將當前幀保存爲圖片 img_name = "%s/%d.jpg" % (path_name, num) image = frame[y - 10: y + h + 10, x - 10: x + w + 10] cv2.imwrite(img_name, image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9]) print("有人來了~~~") alarm(num) # 延遲 60s,不要太頻繁的發送,知道來了就能夠了 time.sleep(60) # 畫出矩形框 cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2) # 顯示當前捕捉到了多少人臉圖片了 font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(frame, 'num:%d/1000' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4) # 顯示圖像 Linux 下注釋掉便可 # cv2.imshow(window_name, frame) c = cv2.waitKey(10) if c & 0xFF == ord('q'): break # 釋放攝像頭並銷燬全部窗口 cap.release() cv2.destroyAllWindows() def alarm(num): my_friend.send('有人闖進臥室了!') my_friend.send_image(os.getcwd()+"/dog/"+str(num)+".jpg") if __name__ == '__main__': camera("watchdog", os.getcwd()+"/dog")
運行腳本,系統會自動生成一個二維碼,使用微信掃描登陸便可:
python3 watchdog.py
而後,把你的狗頭對準攝像頭,神奇的事情就這麼發生了。
有點小遺憾的是,啓動腳本後,Python 進程 CPU 佔用率竟然高達300+,平均每一個 CPU 差很少80+的樣子,心疼個人小風扇一秒鐘。
若是你比較追求精緻,仍是不要這麼搞了,這套方案離小米網絡監控視攝像頭功能差遠了,到手價只要189,而一個樹莓派的板子就 200+。
若是你喜歡瞎折騰,仍是蠻好的,不只能學到知識,還能體會到其中的樂趣,最重要的是能夠爲所欲爲的接入能夠實現的任何功能。