目录

一、开发环境

二、设计要求

三、设计原理

四、程序代码

五、结果展示

六、结论



一、开发环境

python 3.6.6

opencv-python 4.5.1

二、设计要求

· 1、使用opencv-python对人脸口罩进行检测

三、设计原理

设计流程图如图3-1所示,

图3-1 口罩检测流程图

首先进行图片的读取,使用opencv的haar鼻子特征分类器,如果检测到鼻子,则证明没有戴口罩。如果没有检测到鼻子,接着使用opencv的haar眼睛特征分类器,如果没有检测到眼睛,则结束。如果检测到眼睛,则把RGB颜色空间转为HSV颜色空间。进行口罩区域的检测。口罩区域检测流程是首先把距离坐标原点的较近的横坐标作为口罩区域开始横坐标,离坐标原点较远的横坐标作为口罩区域结束横坐标。离坐标原点较远的纵坐标作为口罩区域开始纵坐标,离坐标原点较远的纵坐标与眼睛高度2倍的和作为口罩区域结束纵坐标。在此叙述的可能不是很清楚,可以见图3-2,

图3-2 口罩区域检测图

最后,知道口罩区域时,只需对像素点进行判断就可以判断出是否佩戴口罩。

四、程序代码

完整工程文件: 基于Opencv-python人脸口罩检测​​​​​​​

"""
# File       : mask_check.py
# Time       :2021/6/10 15:02
# Author     :Meng
# version    :python 3.6
# Description:
"""
import cv2          # 导入opencv
import time         # 导入time"""实现鼻子检测"""
def nose_dection(img):img = cv2.GaussianBlur(img,(5,5),0)#高斯滤波gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)                     # 将图片转化成灰度nose_cascade = cv2.CascadeClassifier("haarcascade_mcs_nose.xml")nose_cascade.load("./haarcascades/haarcascade_mcs_nose.xml")  # 文件所在的具体位置'''此文件是opencv的haar鼻子特征分类器'''noses = nose_cascade.detectMultiScale(gray, 1.3, 5)  # 鼻子检测for(x,y,w,h) in noses:cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)  # 画框标识鼻子flag = 0            # 检测到鼻子的标志位,如果监测到鼻子,则判断未带口罩if len(noses)>0:flag = 1return img,flag""""实现眼睛检测"""
def eye_dection(img):img = cv2.GaussianBlur(img,(5,5),0)#高斯滤波gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)                     # 将图片转化成灰度eyes_cascade = cv2.CascadeClassifier("haarcascade_eye_tree_eyeglasses.xml")eyes_cascade.load("./haarcascades/haarcascade_eye_tree_eyeglasses.xml")  # 文件所在的具体位置'''此文件是opencv的haar眼睛特征分类器'''eyes = eyes_cascade.detectMultiScale(gray, 1.3, 5)          # 眼睛检测for (x,y,w,h) in eyes:frame = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)  # 画框标识眼部print("x y w h is",(x,y,w,h))# frame = cv2.rectangle(img, (x, y+h), (x + 3*w, y + 3*h), (255, 0, 0), 2)  # 画框标识眼部return img,eyesdef empty(a):passdef main():image = cv2.imread("images/backgound.png")      # 读取背景照片cv2.imshow('skin', image)                       # 展示cv2.createTrackbar("Hmin", "skin", 0, 90, empty)    # 创建barcv2.createTrackbar("Hmax", "skin", 25, 90, empty)capture = cv2.VideoCapture(0)               # 打开摄像头,其中0为自带摄像头,while True:ref,img=capture.read()                  # 打开摄像头# img = cv2.imread("./images/005.jpg")      # 读取一张图片img_hsv = imgimage_nose,flag_nose = nose_dection(img)       # 进行口罩检测,返回检测之后的图形以及标志位if flag_nose == 1:              # 当检测到鼻子的时候,判断未戴口罩frame = cv2.putText(image_nose, "NO MASK", (10, 30), cv2.FONT_HERSHEY_COMPLEX, 0.9,(0, 0, 255), 1)  # 在图片上写字cv2.imshow('img', image_nose)       # 展示图片if flag_nose == 0:              # 未检测鼻子,进行眼睛检测img_eye,eyes = eye_dection(img)         # 进行眼睛检测,返回检测之后的图形以及标志位hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)        # 将图片转化成HSV格式H, S, V = cv2.split(hsv)                          #Hmin= cv2.getTrackbarPos("Hmin", 'skin')           # 获取barHmax= cv2.getTrackbarPos("Hmax", 'skin')if Hmin> Hmax:Hmax= Hminthresh_h = cv2.inRange(H, Hmin, Hmax)       # 提取人体肤色区域if len(eyes) > 1:                           # 判断是否检测到两个眼睛,其中eyes[0]为左眼坐标# 口罩区域的提取mask_x_begin = min(eyes[0][0],eyes[1][0])               # 把左眼的x坐标作为口罩区域起始x坐标mask_x_end = max(eyes[0][0],eyes[1][0]) + eyes[list([eyes[0][0], eyes[1][0]]).index(max(list([eyes[0][0], eyes[1][0]])))][2]   # 把右眼x坐标 + 右眼宽度作为口罩区域x的终止坐标mask_y_begin = max(eyes[0][1] + eyes[0][3],eyes[1][1] + eyes[1][3]) + 20    # 把眼睛高度最大的作为口罩区域起始y坐标if mask_y_begin > img_eye.shape[1]:     # 判断是否出界mask_y_begin = img_eye.shape[1]mask_y_end = max(eyes[0][1] + 3 * eyes[0][3],eyes[1][1] + 3 * eyes[1][3]) + 20  # 同理if mask_y_end > img_eye.shape[1]:mask_y_end = img_eye.shape[1]frame = cv2.rectangle(img_eye, (mask_x_begin, mask_y_begin), (mask_x_end, mask_y_end), (255, 0, 0), 2)  # 画口罩区域的框total_mask_pixel = 0total_face_pixel = 0# 遍历二值图,为0则total_mask_pixel+1,否则total_face_pixel+1for i in range(mask_x_begin,mask_x_end):for j in range(mask_y_begin,mask_y_end):if thresh_h[i,j] == 0:total_mask_pixel += 1else:total_face_pixel += 1print("total_mask_pixel",total_mask_pixel)print("total_face_pixel", total_face_pixel)if total_mask_pixel > total_face_pixel:frame = cv2.putText(img_eye, "HAVE MASK", (mask_x_begin, mask_y_begin - 10),cv2.FONT_HERSHEY_COMPLEX, 0.9, (0, 0, 255), 1)  # 绘制if total_mask_pixel < total_face_pixel:frame = cv2.putText(img_eye, "NO MASK", (mask_x_begin, mask_y_begin - 10), cv2.FONT_HERSHEY_COMPLEX,0.9, (0, 0, 255), 1)  # 绘制cv2.imshow("skin", thresh_h)  # 显示肤色图cv2.imshow("img", img_eye)  # 显示肤色图# cv2.imwrite('005_result.jpg',img_eye)     保存图片c = cv2.waitKey(10)if c==27:breakcapture.release()       #cv2.destroyAllWindows() # 关闭所有窗口if __name__ == '__main__':main()

五、结果展示

检测结果如下:基于Opencv-python人脸口罩检测

图5-1 HSV转换结果图

图5-2 口罩检测结果图

图5-3 口罩检测结果图(竟然把耳朵误判为鼻子)

六、结论

本实验使用了opencv-python进行了人脸口罩检测。进行鼻子、眼睛检测使用的时opencv自带的.xml文件。从结果来看,这种方法是可行的。是可以应用在地铁站、火车站出入口进行人脸口罩检测的。

本实验也有一定局限性,例如图片中有两个人、眼睛被遮挡等特殊情况。如果感兴趣可以自己训练.xml文件。当然,也可以使用基于深度学习的目标检测模型例如R-CNN系列、YOLO系列、SSD等进行模型的训练。

(注:部分图片来源于网络,侵删)

(如果觉得本篇文章对你有用的话,就麻烦点个赞吧)

基于Opencv-python人脸口罩检测(附完整代码)相关推荐

  1. 基于Opencv的虚拟键盘(附完整代码及报告)

    用到的库:opencv.cvzone.pynput 一.从Opencv到计算机视觉领域: Opencv是传统计算机视觉库,OpenCV用C++语言编写,它具有C ++,Python,Java和MATL ...

  2. Python基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]

    1.视频演示: [项目分享]Python基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]_哔哩哔哩_bilibili 2.图片演示: 3.明厨亮灶: 餐饮企业的厨房卫生状况一直饱受消 ...

  3. 基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]

    1.视频演示: [项目分享]Python基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]_哔哩哔哩_bilibili 2.图片演示: 3.算法原理: 该博客提出的移动侦测即是根据视频 ...

  4. Python实现自动翻译功能 - 附完整代码

    Python实现自动翻译功能 - 附完整代码 随着全球化的不断深入,越来越多的人需要跨越语言障碍进行交流.机器翻译技术的出现为这一问题提供了有效的解决方案.今天,我们将通过Python实现一个自动翻译 ...

  5. 实战6:基于OpenCV的人脸口罩识别检测详细教程

    背景介绍:     从19年疫情爆发到现在,佩戴口罩对大家来说已是常态.应运而生的就有了很多相关应用,如病毒发展预测.口罩佩戴检测以及戴口罩的人脸识别等. 今天介绍的人脸口罩佩戴检测系统主要使用Ope ...

  6. 酷炫的业务看板大屏可以使用 Python 轻松制作( 附完整代码)

    不少公司和学校将信息化手段应用到了日常工作中,数字大屏可以用做数据监控的前端平台,在数据监控与分析中可以起到重要作用. 但是,制作一张大屏可要花费不少精力,如何在一天内快速做好一张数据实时监控大屏?需 ...

  7. Matlab深度学习入门实例:基于AlexNet的红绿灯识别(附完整代码)

    AlexNet于2012年出现在ImageNet的图像分类比赛中,并取得了当年冠军,从此卷积神经网络开始受到人们的强烈关注.AlexNet是深度卷积神经网络研究热潮的开端,也是研究热点从传统视觉方法过 ...

  8. 【通信】基于Matlab实现延时波束形成附完整代码

    1 内容介绍 现代社会发展要求通信系统功能越来越强,性能越来越高,构成越来越复杂;另一方面,要求通信系统技术研究和产品开发缩短周期,降低成本,提高水平.这样尖锐对立的两个方面的要求,只有通过使用强大的 ...

  9. 基于Opencv+python的车流量检测项目

    目录 项目介绍 整体流程 调试环境 项目流程 1.预处理 2.汽车识别--去背景算法(KNN/MOG2) 3.统计车流量数目 结尾 源代码 测试视频资料 流程图 项目介绍 本次项目主要采用了传统视觉的 ...

  10. 基于opencv+python的车道检测技术

    针对自动驾驶系统的实际需求,我们需要一种能够兼顾速度.不同环境下高检测成功率和鲁棒性的车道识别算法.首先,因为停车场更多的是地下光线昏暗的情况需要提高车道线与周围环境的对比度,然后灰度化图像进行模糊降 ...

最新文章

  1. 4 年开发 43 款软件,这位乡村教师火了
  2. 从「王师傅一共损失了多少钱」说开去
  3. java中文问号_java 中文转出来是问号怎么回事?有大神知道怎么改么?
  4. python进程监控 supervisor_使用Python的Supervisor进行进程监控以及自动启动
  5. Java - 用数组求出斐波那契数列的前20项值
  6. 【好文链接】什么是最小二乘法?
  7. [学习笔记]舞蹈链(Dancing Links)C++实现(指针版)
  8. zz在Ubuntu中通过源码安装编译安装软件(MySQL篇)
  9. php开发 文件下载,php 实现文件下载
  10. 推荐两款好用的视频压缩工具(在保证画质的情况下最大限度地压制)
  11. python中的pymysql_Mysql在python中的使用:pymysql
  12. 走遍美国 下载(78集)
  13. 单片机开发,推荐开源跨平台的SDCC编译器
  14. java word水印
  15. 万豪国际扩大北京奢华酒店布局,JW万豪将落户东城区
  16. 北洋UAM-05LX(网口系列适用)ROS节点
  17. SCA连载GDPR罚单之保加利亚国家税务局(NRA)信息泄露事件
  18. React 基础----1
  19. Fire And Motion(英文原版) [转]
  20. Sophos XG Firewall:如何使用Windows Server 2012为企业无线身份验证配置RADIUS

热门文章

  1. 【Unity 资源分享】 | Unity 精品写实动物模型+全套动画 资源分享
  2. 如何使用phpunit运行单一测试方法?
  3. 从外包到互联网,加油,打工人!
  4. OpenCV 图像基本操作
  5. Python3.X识别混合编码,顺便解决“AttributeError: 'module' object has no attribute 'urlopen'”
  6. 一图让你快速弄懂客户端渲染(CSR)与服务端渲染(SSR)
  7. 产品群面:在无领导小组讨论中脱颖而出!
  8. 9.1总结前日(数学+图论)
  9. 一文读懂通配符SSL证书
  10. PIC单片机printf()函数重定向