我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python基于Opencv实现人脸口罩检测

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python基于Opencv实现人脸口罩检测

一、开发环境

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 口罩区域检测图

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

四、程序代码


"""
# 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("data/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 = 1
    return 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("data/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,eyes
 
def empty(a):
    pass
 
def main():
    image = cv2.imread("images/backgound.png")      # 读取背景照片
    cv2.imshow('skin', image)                       # 展示
    cv2.createTrackbar("Hmin", "skin", 0, 90, empty)    # 创建bar
    cv2.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 = img
        image_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)                          #
            minH = cv2.getTrackbarPos("Hmin", 'skin')           # 获取bar
            maxH = cv2.getTrackbarPos("Hmax", 'skin')
            if minH > maxH:
                maxH = minH
            thresh_h = cv2.inRange(H, minH, maxH)       # 提取人体肤色区域
            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 = 0
                total_face_pixel = 0
                # 遍历二值图,为0则total_mask_pixel+1,否则total_face_pixel+1
                for 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 += 1
                        else:
                            total_face_pixel += 1
                print("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:
            break
    capture.release()       #
    cv2.destroyAllWindows() # 关闭所有窗口
 
 
if __name__ == '__main__':
    main()

五、结果展示

检测结果如下:

图5-1 HSV转换结果图

图5-2 口罩检测结果图

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

六、结论

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

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

到此这篇关于python基于Opencv实现人脸口罩检测的文章就介绍到这了,更多相关Opencv 人脸口罩检测内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python基于Opencv实现人脸口罩检测

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何实现基于opencv的行人检测

这篇文章主要为大家展示了“如何实现基于opencv的行人检测”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现基于opencv的行人检测”这篇文章吧。基于方向梯度直方图(HOG)/线性支持向
2023-06-22

Python中基于Opencv怎么实现人脸识别

这篇文章主要讲解了“Python中基于Opencv怎么实现人脸识别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中基于Opencv怎么实现人脸识别”吧!检测人脸。这应该是最基本的
2023-06-02

Python实战之OpenCV实现猫脸检测

开发工具 Python版本:3.6.4 相关模块: cv2模块; 以及一些Python自带的模块。 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可。 原理简介 简单地讲一讲Haar分类器,也就是Viola-Jone
2022-06-02

怎么用Python+OpenCV实现猫脸检测

这篇文章主要介绍了怎么用Python+OpenCV实现猫脸检测的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Python+OpenCV实现猫脸检测文章都会有所收获,下面我们一起来看看吧。开发工具Pytho
2023-06-27

基于Flask和PaddleHub怎么实现人脸检测功能

这篇文章主要介绍“基于Flask和PaddleHub怎么实现人脸检测功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Flask和PaddleHub怎么实现人脸检测功能”文章能帮助大家解决问题。
2023-07-05

Python中怎么实现人脸检测

Python中怎么实现人脸检测,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先需要安装这些包,以Ubuntu为例:$ sudo apt-get install
2023-06-17

python实现人脸检测的实例分析

这篇文章主要介绍“python实现人脸检测的实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python实现人脸检测的实例分析”文章能帮助大家解决问题。OpenCVOpenCV 是计算机视觉领
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录