郑重声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,如果您不同意请关闭该页面!任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
前言
距离上次的上篇已经过去了小半年时间了,真的不是我咕咕了,是因为自己挖的坑有点多,本片文章主要介绍的是如何对人脸进行检测和检测后的通讯方式,树莓派zeor w
性能有点更不上所以我又买了4B(小声BB可能还有终篇
硬件清单
- 读卡器以及 SD 卡
- 树莓派官方摄像头一枚(夜视版
- 树莓派4B
- 电源(实际场景需要装个充电宝或者使用定制的电源)
- 监听模块(如果想要带上声音可以装个)
安装python-opencv
更新树莓派系统
在这之前记得话pip
源 、apt
源、系统更新源换成国内的,并且使用树莓派4并且刷入最新版的包,刷入包的哈希值
SHA-256:c9c382b659bd96b859ccb9e2ac0c2292a91a37c286ab464f2f380d451077663d
sudo apt-get update sudo apt-get upgrade
|
安装python-OpenCV
在这之前还需要把系统自带的python
软连接换成python3.7
的
先查看系统中有那些Python
版本
$ ls /usr/bin/python*
/usr/bin/python /usr/bin/python2-config /usr/bin/python3m /usr/bin/python2 /usr/bin/python3 /usr/bin/python-config /usr/bin/python2.7 /usr/bin/python3.5 /usr/bin/python2.7-config /usr/bin/python3.5m
|
先删除默认的Python软链接:
然后创建一个新的软链接指向需要的Python
版本
sudo ln -s /usr/bin/python3.7 /usr/bin/python
|
安装pip3
后安装3.4.6
版本的opencv
,因为最新版会报错,目前树莓派4最好安装这个版本
sudo apt-get install python3-pip pip3 install opencv-python==3.4.6.27
|

测试是否安装成功

源码编译方式安装OpenCV
如果你不做后续开发之类的,源码编译的方式可以跳过
源码编译安装OpenCV
比较繁琐,安装之后的OpenCV
可以采用多种语言进行开发,是一种全面的安装,安装过程费时费力,笔者安装过程长达三到四个小时,一定要保证电源不会断,并把风扇插上,防止编译把树莓派给烧了
首先我们要安装OpenCV所依赖的各种工具和图像视频库
软件源更新
sudo apt-get update // 升级本地所有安装包,最新系统可以不升级 sudo apt-get upgrade// 升级树莓派固件
|
安装构建OpenCV
的相关工具
sudo 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
有可能出现包版本过高的情况,需要将依赖包降级安装
sudo apt-get install libgtk2.0-dev
|
如果需要降级可以使用下面这个工具,可以使用n
来替换解决方案
sudo apt-get install aptitude
sudo aptitude install libgtk2.0-dev
|
我使用的是这个解决方案

查看有没有安装成功
dpkg --listfiles libgtk2.0-dev
|
优化函数包
sudo apt-get install libatlas-base-dev gfortran
|
获取OpenCV源代
// 下载OpenCV3.4.6 wget -O opencv-3.4.6.zip https://github.com/Itseez/opencv/archive/3.4.6.zip // 解压OpenCV unzip opencv-3.4.6.zip // 下载OpenCV_contrib库: wget -O opencv_contrib-3.4.6.zip https://github.com/Itseez/opencv_contrib/archive/3.4.6.zip // 解压OpenCV_contrib库: unzip opencv_contrib-3.4.6.zip
|
国内可以用这两条命令下载
wget -O opencv-3.4.6.zip https://gitee.com/asc0t6e/opencv/repository/archive/3.4.6.zip wget -O opencv_contrib-3.4.6.zip https://gitee.com/asc0t6e/opencv_contrib/repository/archive/3.4.6.zip
|
编译OpenCv
cd opencv
mkdir 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 ..
|
接着编译
make -j4 sudo make install sudo 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
地址以及服务号,Name
中可以输入也可以不进行输入,点击OK。(记得要填上服务号

接着就是输入你在树莓派设置的密码,连上如下

人脸检测
首先要了解cv2
的几个需要用到的API
,要捕捉视频,需要创建一个VideoCapture
对象。它的参数可以是设备索引或视频文件的名称。设备索引只是指定哪个摄像头的号码。我们树莓派只有一个摄像头那这个参数就填0,如果有第二台摄像头可以通过传递1等来选择他。
接下来写一个dome
,把识别的人脸保存为本地图片,如果想要他后台静默检测,可以把画矩形框
和显示视频
这两行代码给注释了
import cv2 import 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()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = FaceCascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), ) 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

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

源码如下
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication from email.mime.text import MIMEText from email.header import Header from email.mime.image import MIMEImage import zipfile import cv2 import time image_list=[]
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() 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) 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) zip_file.write(time_name+'.jpg') zip_file.close() return time_name+'.zip'
def FaceDetection(): 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()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = FaceCascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), ) 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: 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
运行即可看到效果

注意:
树莓派中显示效果

邮箱中效果如下

点进邮件查看内容,下面的图片是动图

然后我们查看压缩包内容,确实为人脸检测截图的图片

测试成功后注释掉这几行代码,可以减少CPU
的消耗
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()
|
接着我们结束运行中python
脚本,然后使用如下命令重启它
利用QQbot通讯
由于树莓派的是使用ARM
架构的CPU
导致不支持wine
技术,所以如果你是X86
架构的机器来监控的话可以参考如下文档食用,这边就不在概述(浪费了我个把星期倒腾
https://www.ascotbe.com/Medusa/Documentation/#/Bot
|
利用短信通讯
首先需要去官网注册个账号https://pushed.co
,然后在官网创建开发者模板,并且在你手机上下载他们的APP
后登录,由于这个每个月限定1W
条通知,超过的需要付费,感兴趣的可以自行挖掘,这边就不图文讲解了
接着使用如下脚本就能发送消息了
import requests
payload = { "app_key": "APP_KEY", "app_secret": "APP_SECRET", "target_type": "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
|