``# 作品简介:

1·项目实现环境

基于python 3.10版本

opencv-python 4.4版本

pycharm 2021.3.2版本

pycharm RPi.GPIO

需要自己下载OpenCV的库文件,添加其中的分类器

2·设计背景

2020年新冠疫情在世界各地肆虐,可以说无处不在,无孔不入。它的蔓延和由此产生的影响导致了一场前所未有的全球性危机。截止目前为止,疫情任在中华大地肆虐,让人们感受到恐惧和不安,在今年四月,上海,苏州,南京,合肥等中国各大城市又再一次爆发了疫情,在疫情这种特殊情况下,中央和各地卫健委发布通知,每个人出入公众场合都需要佩戴口罩,因此,口罩成为了人们的必需品,但也有很多人不配合戴口罩,这是很危险的行为,但是光看人力去观看有没有佩戴口罩,因此我想出来了利用树莓派OpenCV的方法去检测有没有正确佩戴口罩。

3·安装说明

1·在电脑中安装python环境 python下载渠道https://www.python.org/ 在官网选择自己电脑配置的版本进行安装

2·之后再安装好的python中配置所需要的OpenCV环境,可以使用cmd直接配置pip install opencv-python

3·配置好之后下载pycharm https://www.jetbrains.com/pycharm/

4·在pycharm中配置opencv-python,选择一个资源库进行安装加载。例如清华云,阿里云一些资源库都可以进行下载

5·配置好环境后,先练好自己的不戴口罩和戴口罩的资源库,进行资源库的训练,并且把照片的像素进行修改,形成自己的数据库

6·在pycharm中运行mask.py代码进行人脸的学习,学习一些人脸的特征,再运行masked.py代码进行检测,以免好在戴口罩的时候进行提示

7·在日常生活中进行对出入人员的有无戴口罩的检测

设计思路

先从阿里云或是百度云收集没有戴口罩的图片和戴口罩的图片,作为数据库,进行图片像素的修改,保存至数据中心XML中,通过OpenCV和RPi.GPIO调试摄像头,写mask.python进行OpenCV-python的人像效果的学习,再通过写出masked.python进行没有带口罩的识别学习,最后结合起来进行人脸戴口罩识别的检测。检测人脸有无戴口罩的,并在摄像头中提示红色显示。

重点难点

重点: 重点在于python环境的搭配与Python代码的书写,图片数据库的创建和保留。在写代码过程中发现代码调试过程的运用和图片数据库的调用。

难点:在代码写好后,进行调试中需要配置opencv-python的环境和RPi.GPIO的环境,在配置环境中会遇到与自己的python版本不相符的OpenCV和RPi.GPIO,导致自己所写的代码无法调试出来,因此在安装OpenCV和RPi.GPIO环境时要注意自己的python版本,配置环境是一个很大难点。

``mask.py`
import cv2

face_engine = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’) # 导入人脸级联分类器,‘.xml’文件里包含训练出来的人脸特征
mask_cascade = cv2.CascadeClassifier(‘cascade.xml’) # 导入戴口罩级联分类器,’.xml’文件里包含训练出来的口罩特征

#相机参数设置
cap = cv2.VideoCapture(0) # 调用摄像头摄像头
cap.set(3,640) #摄像头窗口大小
cap.set(4,480)
font = cv2.FONT_HERSHEY_SIMPLEX #字体

while(True):
# 获取摄像头拍摄到的画面
ret, img= cap.read() # 读取一帧图像
# 每帧图像放大1.3倍,重复检测5次
faces = face_engine.detectMultiScale(img,1.3,5)
mask = mask_cascade.detectMultiScale(img,1.3,5)
for (x,y,w,h) in faces:
# 画出人脸框,红色,画笔宽度为1
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.putText(img, ‘no mask’, (x, y - 5), font, 0.5, (255,0,0), 2)
#print(‘face_x=’,x,‘face_y=’,y)
for (ex,ey,ew,eh) in mask:
#画出口罩框,绿色,画笔宽度为1
cv2.rectangle(img,(int(ex),int(ey)),(int(ex+ew),int(ey+eh)),(0,255,0),1)
cv2.putText(img, ‘mask’, (ex, ey - 5), font, 0.5, (0,255,0), 1)
# 实时展示效果画面
cv2.imshow(‘img’,img)
# 每100毫秒监听一次键盘动作,按ESC退出循环
k = cv2.waitKey(100) & 0xff
if k == 27:
break

最后,关闭所有窗口,释放资源

cap.release()
cv2.destroyAllWindows()

masked.py
import cv2
import RPi.GPIO as GPIO
import time

face_engine = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’) # 导入人脸级联分类器,‘.xml’文件里包含训练出来的人脸特征
mask_cascade = cv2.CascadeClassifier(‘cascade.xml’) # 导入戴口罩级联分类器,’.xml’文件里包含训练出来的口罩特征

#相机参数设置
cap = cv2.VideoCapture(0) # 调用摄像头摄像头
cap.set(3,640) #摄像头窗口大小
cap.set(4,480)
font = cv2.FONT_HERSHEY_SIMPLEX #字体
#初始化GPIO接口
GPIO.setmode(GPIO.BCM)
GPIO.setup(18,GPIO.OUT)
GPIO.setup(23,GPIO.OUT)

while(True):
# 获取摄像头拍摄到的画面
ret, img= cap.read() # 读取一帧图像
# 每帧图像放大1.3倍,重复检测5次
faces = face_engine.detectMultiScale(img,1.3,5)
mask = mask_cascade.detectMultiScale(img,1.3,5)
for (x,y,w,h) in faces:
# 画出人脸框,红色,画笔宽度为1
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),1)
cv2.putText(img, ‘no mask’, (x, y - 5), font, 0.5, (255,0,0), 1)
#LED显示红灯
GPIO.output(18,GPIO.HIGH)
time.sleep(0.5)
GPIO.output(18,GPIO.LOW)
for (ex,ey,ew,eh) in mask:
#画出口罩框,绿色,画笔宽度为1
cv2.rectangle(img,(int(ex),int(ey)),(int(ex+ew),int(ey+eh)),(0,255,0),1)
cv2.putText(img, ‘mask’, (ex, ey - 5), font, 0.5, (0,255,0), 1)
#LED显示绿灯
GPIO.output(23,GPIO.HIGH)
time.sleep(0.5)
GPIO.output(23,GPIO.LOW)
# 实时展示效果画面
cv2.imshow(‘img’,img)
# 每100毫秒监听一次键盘动作,按ESC退出循环
k = cv2.waitKey(100) & 0xff
if k == 27:
break

最后,关闭所有窗口,释放资源

cap.release()
cv2.destroyAllWindows()
GPIO.cleanup()

Logo

助力合肥开发者学习交流的技术社区,不定期举办线上线下活动,欢迎大家的加入

更多推荐