希望您在学习 opencv 时玩得开心。如果您还没有查看我们以前的帖子,请单击此处。今天我们将继续同样有趣的学习路径,并实现“使用 opencv 和 Haarcascade 进行人脸口罩检测”。因此,不要浪费任何时间,让我们开始吧。这篇文章也将包括上一篇文章的一些部分。你可以在这里查看。
介绍:
随着冠状病毒成为人类历史上最致命的流行病之一,口罩已成为人类最不可或缺的一部分。仍然有很多人对口罩的使用不屑一顾。技术有没有办法帮助我们找到这些粗心的人。当然是的。在计算机视觉的帮助下,我们可以检测一个人是否戴口罩。如何?让我们来了解一下
让我们编码:
我们将首先导入库并加载基本的 XML 文件。
import numpy as np
import cv2
import random
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
mouth_cascade = cv2.CascadeClassifier('Mouth.xml')
初始化其他参数:
bw_threshold = 80
font = cv2.FONT_HERSHEY_SIMPLEX
org = (30, 30)
weared_mask_font_color = (0, 255, 0)
not_weared_mask_font_color = (0, 0, 255)
noface = (255, 255, 255)
thickness = 2
font_scale = 1
weared_mask = "Thank You for wearing MASK"
not_weared_mask = "Please wear MASK to defeat Corona"
cap = cv2.VideoCapture(0)
检测口罩:
while True:
ret, img = cap.read()
img = cv2.flip(img,1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(thresh, black_and_white) = cv2.threshold(gray, bw_threshold, 255, cv2.THRESH_BINARY)
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
faces_bw = face_cascade.detectMultiScale(black_and_white, 1.1, 4)
While True 循环从相机连续读取帧。
if(len(faces) == 0 and len(faces_bw) == 0):
cv2.putText(img, "No face found...", org, font, font_scale, noface, thickness, cv2.LINE_AA)
elif(len(faces) == 0 and len(faces_bw) == 1):
cv2.putText(img, weared_mask, org, font, font_scale, weared_mask_font_color, thickness, cv2.LINE_AA)
else:
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 255), 2)
roi_gray = gray[y:y + h, x:x + w]
roi_color = img[y:y + h, x:x + w]
mouth_rects = mouth_cascade.detectMultiScale(gray, 1.5, 5)
现在我们检查是否检测到任何人脸。if 条件会检查这一点。
if(len(mouth_rects) == 0):
cv2.putText(img, weared_mask, org, font, font_scale, weared_mask_font_color, thickness, cv2.LINE_AA)
else:
for (mx, my, mw, mh) in mouth_rects:
if(y < my < y + h):
cv2.putText(img, not_weared_mask, org, font, font_scale, not_weared_mask_font_color, thickness, cv2.LINE_AA)
break
输出应该是这样的。在实现这个之后,我很想知道如果我用我的手而不是面具这个代码是否会起作用(我想这个问题在这篇博客的过程中也一定会出现在你的脑海中)。这是它的外观。
嗯,这就是它的样子。该程序传达了一个信息,即一个人虽然没有戴口罩。这是因为我们使用了简单的逻辑,即只检查嘴部特征是否可用于可用的面部特征,这些特征可以使用任何面具/手或任何其他对象隐藏。这就是我们遇到这个误报案例的原因。如何解决这个问题?。我们需要训练一个自定义的神经网络模型来只检测带面具的人脸,而不是其他任何东西。好吧,这是另一个博客的主题。在此处查看本博客的下一部分,了解如何为您的深度学习解决方案收集图像数据。
结尾:
这就是在 opencv 中使用 Haarcascades 进行掩码检测的方法。希望现在您对它有一个清晰的了解。请在此处查看完全结构化的代码。请关注我们的Instagram和Telegram帐户,每天获取此类信息丰富的内容。
import numpy as np
import cv2
import random
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
mouth_cascade = cv2.CascadeClassifier('Mouth.xml')
bw_threshold = 80
font = cv2.FONT_HERSHEY_SIMPLEX
org = (30, 30)
weared_mask_font_color = (0, 255, 0)
not_weared_mask_font_color = (0, 0, 255)
noface = (255, 255, 255)
thickness = 2
font_scale = 1
weared_mask = "Thank You for wearing MASK"
not_weared_mask = "Please wear MASK to defeat Corona"
cap = cv2.VideoCapture(0)
while True:
ret, img = cap.read()
img = cv2.flip(img,1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(thresh, black_and_white) = cv2.threshold(gray, bw_threshold, 255, cv2.THRESH_BINARY)
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
faces_bw = face_cascade.detectMultiScale(black_and_white, 1.1, 4)
if(len(faces) == 0 and len(faces_bw) == 0):
cv2.putText(img, "No face found...", org, font, font_scale, noface, thickness, cv2.LINE_AA)
elif(len(faces) == 0 and len(faces_bw) == 1):
cv2.putText(img, weared_mask, org, font, font_scale, weared_mask_font_color, thickness, cv2.LINE_AA)
else:
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 255), 2)
roi_gray = gray[y:y + h, x:x + w]
roi_color = img[y:y + h, x:x + w]
mouth_rects = mouth_cascade.detectMultiScale(gray, 1.5, 5)
if(len(mouth_rects) == 0):
cv2.putText(img, weared_mask, org, font, font_scale, weared_mask_font_color, thickness, cv2.LINE_AA)
else:
for (mx, my, mw, mh) in mouth_rects:
if(y < my < y + h):
cv2.putText(img, not_weared_mask, org, font, font_scale, not_weared_mask_font_color, thickness, cv2.LINE_AA)
break
cv2.imshow('Mask Detection', img)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()