内容简介:更多精彩 第一时间直达
点击▲关注 “ 爪哇笔记 ” 给公众号标星置顶
更多精彩 第一时间直达
前言
前几天,在食堂吃饭,本来每天中午的新闻三十分换成了视频监控。我们已经习惯了,前十分钟看着领导都很忙,中间十分钟中国人民都很幸福,后十分钟别的国家都生活在水深火热里,顺便跟同事谈谈国家大事。突然主角换成了我们自己,便毫无抬头的欲望。
恰巧最近也有在接触大屏监控的解决方案,于是乎,就索性拿树莓派实验了一把,做一个智能监控系统。
软硬件清单
-
读卡器以及 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+。
如果你喜欢瞎折腾,还是蛮好的,不仅能学到知识,还能体会到其中的乐趣,最重要的是可以随心所欲的接入可以实现的任何功能。
「玩转树莓派」搭建属于自己的云盘服务
「玩转树莓派」为女朋友打造一款智能语音闹钟
点 在看 再走呗!
以上所述就是小编给大家介绍的《“玩转树莓派”搭建智能家居远程监控系统》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 树莓派+Homebriage+米家智能产品搭建Siri智能家居
- 「玩转树莓派」搭建智能家居远程监控系统
- 玩玩智能家居2:ESPEasy
- 智能家居系统的开源尝试
- 五大技术助力,不安全的智能门锁能否成为智能家居的下一个入口?
- “Dojo”网络安全智能家居产品发售 200美元
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Domain-Driven Design
Eric Evans / Addison-Wesley Professional / 2003-8-30 / USD 74.99
"Eric Evans has written a fantastic book on how you can make the design of your software match your mental model of the problem domain you are addressing. "His book is very compatible with XP. It is n......一起来看看 《Domain-Driven Design》 这本书的介绍吧!