「玩轉樹莓派」搭建智能家居遠程監控系統

来源:https://www.cnblogs.com/smallSevens/archive/2019/05/08/10828392.html
-Advertisement-
Play Games

前言 前幾天,在食堂吃飯,本來每天中午的新聞三十分換成了視頻監控。我們已經習慣了,前十分鐘看著領導都很忙,中間十分鐘中國人民都很幸福,後十分鐘別的國家都生活在水深火熱里,順便跟同事談談國家大事。突然主角換成了我們自己,便毫無抬頭的欲望。 恰巧最近也有在接觸大屏監控的解決方案,於是乎,就索性拿樹莓派實 ...


前言

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

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

軟硬體清單

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

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

監控系統

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

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

motion

安裝:

sudo apt-get install motion

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

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%左右,並且有一定的延遲,卡頓特別嚴重。

mjpg-streamer

先安裝依賴:

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 實現

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

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

安裝 OpenCV

安裝基礎組件:

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+。

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

源碼:https://gitee.com/52itstyle/Python/tree/master/Day23


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • https://blog.csdn.net/qq_42076140/article/details/82113622 原文地址 ...
  • 可以使用js自帶的for in、也可以使用Ext JS中的方法來遍歷js對象中的屬性 代碼如下: ...
  • 最近在做小程式的登錄,需要同時獲取用戶手機號和頭像昵稱等信息,但是小程式又不支持單個介面同時獲取兩種數據,因此想到自定義一個彈窗,通過彈窗按鈕觸發獲取手機號事件。記錄一下。 具體代碼如下: 業務代碼中: 在業務代碼中引入dialog組件即可 <dialog visible="{{dialogVisi ...
  • 服務引入 服務引入使用reference標簽來對要引入的服務進行配置,包括服務的介面 ,名稱,init,check等等配置屬性。 在DubboNamespaceHandler中,我們可以看到reference標簽是通過引入一個ReferenceBean類型的bean實現的,那麼我們就以這個bean為 ...
  • 官網:www.fhadmin.org 工作流模塊 1.模型管理 :web線上流程設計器、預覽流程xml、導出xml、部署流程 2.流程管理 :導入導出流程資源文件、查看流程圖、根據流程實例反射出流程模型、激活掛起 3.運行中流程:查看流程信息、當前任務節點、當前流程圖、作廢暫停流程、指派待辦人 4. ...
  • 單例模式是一種設計模式,這一種設計模式的目的是使得該類在整個JVM系統中只有唯一的一個實例對象,在就java開發過程中,很多場景下會碰到這種需求,所以單例模式也是最常用的設計模式之一,下麵從以下幾個方面對單例模式進行解說。 一、單例模式的概念: 需要設計一個類,達到的效果:在類的整個應用中指存在一個 ...
  • 編程語言集成了發佈訂閱 很多編程語言框架里都提供了發佈訂閱的組件,或者叫事件處理機制,而spring框架對這個功能也有支持,主要使用 實現訂閱,使用 使用發佈。這種系統集成的我們先叫它“集成組件” 與語言無關的消息隊列 事實上,發佈訂閱真的與開發語言沒有什麼關係,所以出現了另一種產品,消息中間件,或 ...
  • 首先會看懂UML UML類圖與類的關係詳解 虛線箭頭指向依賴;實線箭頭指向關聯;虛線三角指向介面;實線三角指向父類;空心菱形能分離而獨立存在,是聚合;實心菱形精密關聯不可分,是組合; 上面是UML的語法。在畫類圖的時候,理清類和類之間的關係是重點。類的關係有泛化(Generalization)、實現 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...