软硬件清单

  • 读卡器以及 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-pythonDownloading 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 329d9d9fdd62b93d44a485aeaab4602c6f5b8555ea8bcc7dbcdc62c90cfe2c3fGot        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 = 0while 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 = faceRectnum = 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_SIMPLEXcv2.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")
#小编整理一套Python资料和PDF,有需要Python学习资料可以加学习群:631441315 ,反正闲着也是闲着呢,不如学点东西啦~~

运行脚本,系统会自动生成一个二维码,使用微信扫描登录即可:

python3 watchdog.py

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

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

小结

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

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

「玩转Python」搭建远程监控系统,小偷?不存在的!相关推荐

  1. python的输入函数是什么意思_「小白学Python」像风一样自由的输入:input( )函数详解...

    从使用Python写出第一行代码:print("Hello Python")时,我就怀揣着一个梦想,有一天,我一定要输入自己想要的内容.今天这个梦想终于实现了,多亏了input( ...

  2. python中字符型用什么表示_「小白学Python」Python中最常用的数据类型:字符串

    Python中有6个标准数据类型,分别是:Number(数值).String(字符串).List(列表).Tuple(元组).Sets(集合).Dictionary(字典). 其中,String(字符 ...

  3. 【解决方案】EasyCVR视频结构化平台如何搭建肉品屠宰场全市联网远程监控系统?

    一.背景分析 随着社会和科技的进步.经济发展,为构建高效.统一的政府肉品信息监管体系:实现生猪屠宰行业和信息化监管,及时发现并处理违法违规行为,切实保障肉品生产安全:规范肉品流通秩序,强化生猪屠宰加工 ...

  4. 一种飞机维修机库大门的远程监控系统及搭建方法

    飞机维修机库和飞机装备工厂等飞机停放库均设有机库大门,这些机库大门通常体积都比较巨大,且其门洞是进出飞机的通道,因此,对机库大门的控制至关重要.现有的机库大门的控制系统需要管理人员及生产厂家的售后人员 ...

  5. 普罗米修斯监控系统_一步步教你用Prometheus搭建实时监控系统系列(二)——详细分析拉取和推送两种不同模式...

    前言 本系列着重介绍Prometheus以及如何用它和其周边的生态来搭建一套属于自己的实时监控告警平台. 本系列受众对象为初次接触Prometheus的用户,大神勿喷,偏重于操作和实战,但是重要的概念 ...

  6. 不用羡慕BAT,自己手工也能搭建伪基站监控系统

    本文讲的是不用羡慕BAT,自己手工也能搭建伪基站监控系统,编者按:伪基站是个很烦人的东西.基于海量移动终端用户,近两年BAT3在国内搭建了强大的伪基站监控系统,在打击犯罪上贡献不少.这篇文章中,作者将 ...

  7. monit 内存 监控_如何借助Monit搭建服务器监控系统?(1)

    许多Linux管理员依赖一种集中式远程监控系统(比如Nagios或Cacti),检查网络基础设施的健康状况.虽然集中式监控系统为管理员在处理许多主机和设备时简化了工作,但专用的监控设备显然成了单一故障 ...

  8. boa服务器实现温湿度显示,SMT车间温湿度分布式远程监控系统的设计

    随着SMT生产工艺技术的提高,生产车间对环境的温湿度提出了温度25±3℃.湿度45%RH-65%RH的要求.为了达到这样的温湿度要求,就不仅需要提高温湿度传感器的精度,而且要求现场的管理人员能够实时的 ...

  9. 基于工业路由器的工业机器人远程监控系统方案应用

    一.方案背景 随着我国经济的高速发展和产业升级的不断进行,现代工业机器人在柔性加工等生产中应用越来越广泛.生产线上的工业机器人.机械臂的稳定可靠对企业生产的稳定及经济效益保证意义重大.工业机器人机构复 ...

最新文章

  1. android高德地图显示多点标记,高德地图多点标记自定义地图
  2. php未登录跳到登陆页面,vue实现未登录跳转到登录页面的方法
  3. python3安装scrapy问题解决
  4. c语言a 寻路算法,JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
  5. 史上最可爱的关系抽取指南?从一条规则到十个开源项目
  6. 推荐系统--矩阵分解(4)
  7. CSS3与页面布局学习总结(八)——浏览器兼容与前端性能优化
  8. google annotation笔记
  9. composer安装Workerman报错:Installation failed, reverting ./composer.json to its original content....
  10. Android透明效果的实现
  11. unity, itween, closed path
  12. 在fmri研究中,cca的应用历史
  13. SQL_SERVER_2008升级SQL_SERVER_2008_R2的方法
  14. c4isr系统有无服务器,什么是C4ISR系统?
  15. Windows下打开.jar文件的方式
  16. 八皇后问题(递归回溯算法详解+C代码)
  17. 搭建一个个人网站需要多少钱预算?
  18. 服务器c盘怎么删除临时文件,删除临时文件夹中临时文件的方法
  19. 解析少儿编程与创客教育的实战原理
  20. C语言基础入门48篇_30_二维数组的定义与使用(二维数组的定义:type 数组名[行][列]、二维数组的初始化、二维数组的引用)

热门文章

  1. 程序员加薪必备,绘制架构图,流程图神器推荐
  2. 爬取淘宝获取的内容与网页显示的内容不一致?
  3. JavaScript:断点调试
  4. 郑州大学远程教育学院计算机应用基础,[知识]2012-10-17——郑州大学远程教育学院2012计算机应用基础考试考题及答案...
  5. android开发笔记之 Android代码混淆打包
  6. java8 reduce的用法_Java 8系列之Stream中万能的reduce用法说明
  7. nonebot2插件之主持双音节猜成语
  8. 大多数程序员都需要相亲吗?
  9. hive时空链战_链战 (Chain Strike)
  10. 计算机死机的解决方法及操作步骤,电脑突然死机怎么办?试试这几种方法