
距离上次的上篇已经过去了小半年时间了
真的不是我咕咕了 是因为自己挖的坑有点多
本片文章主要介绍的是如何对人脸进行检测和检测后的通讯方式
树莓派 zeor w 性能有点跟不上 所以今天的主角是4B。
硬件清单
· 读卡器以及 SD 卡
· 树莓派官方摄像头一枚(夜视版)
· 树莓派4B
· 供电设备 (实际场景需要装个充电宝或者使用定制的电源)
· 监听模块 (如果想要带上声音可以装个)
更新树莓派系统
在这之前需要将pip源 、apt源、系统更新源换成国内的
并且使用树莓派4并且刷入最新版的系统包。
sudo apt-get update sudo apt-get upgrade
安装python-OpenCV
安装pip3后安装3.4.6版本的opencv
因为最新版会报错,目前树莓派4最好安装这个版本
sudo apt-get install python3-pip pip3 install opencv-python==3.4.6.27
安装成功测试

源码编译方式安装OpenCV
如果你不做后续开发之类的,源码编译的方式可以跳过
源码编译安装OpenCV比较繁琐
安装之后的OpenCV可以采用多种语言进行开发
是一种全面的安装,安装过程费时费力
笔者安装过程长达三到四个小时 一定要保证电源不会断并把风扇插上
防止编译把树莓派给烧了
Let‘ go~ 首先我们要安装OpenCV所依赖的各种工具和图像视频库
构建 OpenCV 的相关工具和常用图像工具包
#安装build-essential、cmake、git和pkg-configsudo apt-get install build-essential cmake git pkg-config# jpeg格式图像工具包sudo apt-get install libjpeg8-dev // 安装tif格式图像工具包sudo apt-get install libtiff5-dev // 安装JPEG-2000图像工具包sudo apt-get install libjasper-dev // 安装png图像工具包sudo apt-get install libpng12-dev#视频I/O包sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
安装gtk2.0
ubuntu 有可能出现包版本过高的情况,需要将依赖包降级安装
#务必安装该包后再编译opencv sudo apt-get install libgtk2.0-dev
如果需要降级可以使用下面这个工具,可以使用n来替换解决方案
我使用的是这个解决方案

获取OpenCV源代码
// 下载OpenCV3.4.6 wget -O opencv-3.4.6.zip https://gitee.com/asc0t6e/opencv/repository/archive/3.4.6.zip // 解压OpenCV unzip opencv-3.4.6.zip // 下载OpenCV_contrib库:wget -O opencv_contrib-3.4.6.zip https://gitee.com/asc0t6e/opencv_contrib/repository/archive/3.4.6.zip // 解压OpenCV_contrib库:unzip opencv_contrib-3.4.6.zip
编译OpenCv
#进入OpenCv目录cd opencv#新建release文件夹mkdir release#进入release文件夹cd release# 预编译cmake -D CMAKE_BUILD_TYPE=RELEASE \-D CMAKE_INSTALL_PREFIX=/usr/local \-D INSTALL_PYTHON_EXAMPLES=ON \-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.6/modules \-D WITH_FFMPEG=ON \-D BUILD_EXAMPLES=ON ..#用4个核心编译他make -j4sudo make installsudo ldconfig
安装VNC
首先树莓派上安装vnc服务
sudo apt-get install tightvncserver
输入vncpasswd来设置你的vnc密码
接着会问你
Would you like to enter a view-only password (y/n)?
选择 n 就好
然后输入vncserver来启动服务
记着这个参数后面连接需要用!!!!

在这个网站下载符合你电脑的版本
https://www.realvnc.com/en/connect/download/viewer/
点击File -> New connection
弹出Properties在VNC Server中输入树莓派对应IP地址和端口

人脸检测
首先要了解cv2的几个需要用到的API要捕捉视频
需要创建一个VideoCapture对象
它的参数可以是设备索引或视频文件的名称
设备索引只是指定哪个摄像头的号码
我们树莓派只有一个摄像头那这个参数就填0
如果有第二台摄像头可以通过传递1等来选择他
接下来写一个dome,把识别的人脸保存为本地图片,如果想要他后台静默检测,可以把画矩形框和显示视频这两行代码给注释了
import cv2import time#这个是你人脸检测训练好数据的文件目录FaceCascadePath="haarcascade_frontalface.xml"FaceCascade = cv2.CascadeClassifier(FaceCascadePath)# 打开视频捕获设备video_capture = cv2.VideoCapture(0)while True:if not video_capture.isOpened():#检查它是否被初始化time.sleep(5)pass# 读视频帧ret, frame = video_capture.read()#如果帧被正确读取,则为True# 转为灰度图像gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 调用分类器进行检测,如果有人脸返回一个列表faces = FaceCascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(30, 30),# flags=cv2.cv.CV_HAAR_SCALE_IMAGE)if len(faces)>0:cv2.imwrite(str(int(time.time())) + '.jpg', frame) # 存储为图像# 画矩形框for (x, y, w, h) in faces:cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示视频cv2.imshow('Video', frame)if cv2.waitKey(1) & 0xFF == ord('q'):break# 关闭摄像头设备video_capture.release()# 关闭所有窗口cv2.destroyAllWindows()
接下来使用树莓派测试下

既然检测到了人,那么接下来需要的就是让它如何告诉你了是不是
利用邮件通讯
接下来就是敲发邮件的代码了,首先需要你注册一个网易邮箱
然后点击设置->POP3/SMTP/IMAP

开启后会给你一串授权码,就是下面打码的那一段

源码如下
# !/usr/bin/python# -*- coding: UTF-8 -*-import smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.application import MIMEApplicationfrom email.mime.text import MIMETextfrom email.header import Headerfrom email.mime.image import MIMEImageimport zipfileimport cv2import timeimage_list=[]#图片列表# 第三方 SMTP 服务mail_host = "smtp.163.com" # 设置服务器mail_user = "XXXXXX@163.com" # 用户名mail_pass = "XXXXXXXXXXXXX" # 口令receiver = 'XXXXXXXX@163.com' #接收邮件def SendEamil(zip_file,image_file):# 邮件内容email_box = MIMEMultipart()#创建容器# message = MIMEText("警戒警戒!莎莎检测到有人入侵!数据以保存喵~", 'plain', 'utf-8')#邮箱文字# email_box.attach(message)#存入email_box['From'] = "Salsa<"+mail_user+ ">"#发送人email_box ['To'] = receiver#发给谁email_box ['Subject'] = Header("入侵警报", 'utf-8')#标题#发送压缩文件zip_apart = MIMEApplication(open(zip_file, 'rb').read())zip_apart.add_header('Content-Disposition', 'attachment', filename=zip_file)email_box.attach(zip_apart)#添加表情包图片msgAlternative = MIMEMultipart('alternative')email_box.attach(msgAlternative)mail_msg = """<p>警戒警戒!莎莎检测到有人入侵!数据以保存喵~</p><p><img src="cid:dns_config"></p>"""msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))# 指定图片为当前目录file = open(image_file, "rb")img_data = file.read()file.close()img = MIMEImage(img_data)img.add_header('Content-ID', 'dns_config')email_box.attach(img)try:smtpObj = smtplib.SMTP()smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号smtpObj.login(mail_user, mail_pass)smtpObj.sendmail(mail_user, receiver, email_box.as_string())print("发送成功")smtpObj.quit()smtpObj.close()except smtplib.SMTPException as e:print(e)def ZIP(time_name):zip_file = zipfile.ZipFile(time_name+'.zip', 'w', zipfile.ZIP_DEFLATED)# 把zfile整个目录下所有内容,压缩为new.zip文件zip_file.write(time_name+'.jpg')# 把c.txt文件压缩成一个压缩文件# zip_file.write('c.txt',compress_type=zipfile.ZIP_DEFLATED)zip_file.close()return time_name+'.zip'def FaceDetection():FaceCascadePath = "haarcascade_frontalface.xml"FaceCascade = cv2.CascadeClassifier(FaceCascadePath)# FaceCascade = cv2.CascadeClassifier(config.FaceCascadePath)# 打开视频捕获设备video_capture = cv2.VideoCapture(0)while True:if not video_capture.isOpened(): # 检查它是否被初始化time.sleep(5)pass# 读视频帧ret, frame = video_capture.read() # 如果帧被正确读取,则为True# 转为灰度图像gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 调用分类器进行检测,如果有人脸返回一个列表faces = FaceCascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(30, 30),# flags=cv2.cv.CV_HAAR_SCALE_IMAGE)if len(faces) > 0:time_name=str(int(time.time()))image_list.append(time_name)time.sleep(1)cv2.imwrite(time_name + '.jpg', frame) # 存储为图像if len(image_list)>4:#如果容器里面图片超过4张发送邮件,防止疯狂发送zip_file=ZIP(time_name)SendEamil(zip_file, "test.gif")image_list.clear()# 画矩形框for (x, y, w, h) in faces:cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示视频cv2.imshow('Video', frame)if cv2.waitKey(1) & 0xFF == ord('q'):break# 关闭摄像头设备video_capture.release()# 关闭所有窗口cv2.destroyAllWindows()if __name__ == '__main__':FaceDetection()
下图中1和3都改为你的网易云邮箱
2改为你的授权码

然后使用python face.py运行即可看到效果
注意
发邮件的话最好自己邮箱发送给自己邮箱
因为测试发现如果使用网易邮箱发邮件给QQ邮箱一段时间内超过一定次数会直接封禁
并且不能在文本中插入图片
由于没办法在文中放入其他文件 我已把项目上传到了github上
项目中也是需要修改网易云邮箱和授权码的,还有人脸画框是被注释掉的最终版本
所以不会看到下面树莓派中人脸画框的效果,但是识别到人脸还是依旧可以发送的。
树莓派中显示效果

邮箱中效果如下

点进邮件查看内容,确实为人脸检测截图的图片

利用QQbot通讯
由于树莓派的是使用ARM架构的CPU导致不支持wine技术
所以如果你是X86架构的机器来监控的话可以参考如下文档食用
这边就不在概述(浪费了我个把星期倒腾
https://www.ascotbe.com/Medusa/Documentation/#/Bot
利用短信通讯
首先需要去官网注册个账号https://pushed.co
在官网创建开发者模板并且在你手机上下载他们的APP后登录
由于这个每个月限定1W条通知 超过的需要付费
感兴趣的可以自行挖掘,这边就不图文讲解了
接着使用如下脚本就能发送消息了
# !/usr/bin/python3import requestspayload = {"app_key": "APP_KEY",#你开发者面板里面可以找到"app_secret": "APP_SECRET",#你开发者面板里面可以找到"target_type": "app",#由于我们是发送到手机上所以类型为app"content": "警戒警戒!莎莎检测到有人入侵!数据以保存喵~"}r = requests.post("https://api.pushed.co/1/push", data=payload)
最终效果如下图

后记
终于填上了自己挖的坑之一,可以去填其他的坑了23333,不过你们没发现这个只能检测人脸,而无法分辨这张脸是谁吗,这样如果自己进来也会给你发邮件是不是,如果有时间的话,就再肝一篇人脸识别的文章,可以检测检测你是谁,你的颜值,你的年龄等等,如果没有的话你就当我前面没说。
参考文章
https://www.cnblogs.com/shizhengwen/p/8719062.html
https://tunm.top/archive/
https://www.ptorch.com/docs/6/opencv_video_display

本文作者:ascotbe
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/129169.html
必填 您当前尚未登录。 登录? 注册
必填(保密)