29

“玩转树莓派”搭建智能家居远程监控系统

 5 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzA3OTUyNjkwMw%3D%3D&%3Bmid=2656651759&%3Bidx=1&%3Bsn=d0e264b60d706269d13f6e54e5009473&%3Bchksm=841fc777b3684e61a18cc64756009af28224ebbde562b1cec900db4a9deca70b3025a2f
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

点击▲关注 “ 爪哇笔记 ”   给公众号标星置顶

更多精彩 第一时间直达

YRFf6f2.jpg!web

前言

前几天,在食堂吃饭,本来每天中午的新闻三十分换成了视频监控。我们已经习惯了,前十分钟看着领导都很忙,中间十分钟中国人民都很幸福,后十分钟别的国家都生活在水深火热里,顺便跟同事谈谈国家大事。突然主角换成了我们自己,便毫无抬头的欲望。

恰巧最近也有在接触大屏监控的解决方案,于是乎,就索性拿树莓派实验了一把,做一个智能监控系统。

软硬件清单

  • 读卡器以及 SD 卡(装系统用)

  • 摄像头一枚,支持 USB

  • SSH连接工具(SecureCRT,Xshell)

  • 宽带、路由器(家中常备)

  • 装好系统的树莓派 3B+ 一只(充电器、CPU散热风扇等)

在开始之前照常先秀一下这半成品的监控系统,是不是丑到爆!?

6B7vYrr.jpg!web

监控系统

市面上有很多开源的摄像头管理软件,比如 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、高度、宽度修改,参考下图:

ANvMJ3b.jpg!web

然后退出到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"

如果出现以下错误:

i6FniaQ.jpg!web

多插拔几次摄像头兴许就可以了。

多参数启动:

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

最终画面:

vUbuMje.jpg!web

这个就流畅多了,CPU差不多也占到五六十的样子,不过无碍,毕竟是4核。

Python 实现

上面两种方式只能做到浏览器监控访问,非局域网还得搭个穿透才能访问,看似华丽,其实并没有实际卵用。

为了更加智能的实现监控告警,下面我们采用Python +OpenCV+Wechat 实现。

RRVn6r6.png!web

安装 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

然后,把你的狗头对准摄像头,神奇的事情就这么发生了。

AVNrauZ.jpg!web

有点小遗憾的是,启动脚本后,Python 进程 CPU 占用率居然高达300+,平均每个 CPU 差不多80+的样子,心疼我的小风扇一秒钟。

小结

如果你比较追求精致,还是不要这么搞了,这套方案离小米网络监控视摄像头功能差远了,到手价只要189,而一个树莓派的板子就 200+。

如果你喜欢瞎折腾,还是蛮好的,不仅能学到知识,还能体会到其中的乐趣,最重要的是可以随心所欲的接入可以实现的任何功能。

jEJRZnA.jpg!web

「玩转树莓派」搭建属于自己的云盘服务

U3Ajeqb.jpg!web

「玩转树莓派」为女朋友打造一款智能语音闹钟

在看 再走呗! yeqUryu.gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK