Aperçu
-
Auparavant, j'utilisais OpenCV pour visualiser la situation de visualisation des œuvres d'art.
https://qiita.com/cami_oshimo/items/ce33491c07f9625ed121
-
J'ai pensé que si j'appliquais cela et que je passais à la détection de la bouche au lieu des yeux, je pourrais utiliser le masque pour juger du port.
-
Tout d'abord, déterminez simplement si votre bouche est exposée, puis déterminez si vous portez un masque.
Que préparer
- Raspberry Pi3 modèle B (4 est probablement correct)
- Cas pour Raspberry Pi
- Dissipateur de chaleur pour Raspberry Pi
- Raspberry Pi3 Model B B + ensemble d'alimentation compatible (5V 3.0A)
- Caméra pour raspberry Pi
- Moniteur avec entrée HDMI
- Trépied de magasin de 100 yens
- Le fonctionnement à distance de Raspberry Pi à partir d'un PC utilisant VNC facilite le développement.
Préparation
- Configurez Raspberry Pi.
- Gardez l'appareil photo Raspberry Pi prêt à l'emploi.
https://www.raspberrypi.org/downloads/
- Rendre la bibliothèque OpenCV et le fichier en cascade disponibles.
haarcascade_frontalface_default.xml (détection de visage)
haarcascade_mcs_mouth.xml (détection de la bouche)
programmation
- Un message vous invitant à cadrer votre visage, un cadre pour la détection de visage / bouche et un avertissement lorsque le masque n'est pas porté sont superposés sur l'image de la caméra.
- Si un visage est détecté et une bouche est détectée, il est jugé que le masque n'est pas porté.
import sys
sys.path.append('/home/pi/.local/lib/python2.7/site-packages')
import numpy as np
import cv2
import time
import datetime
import ambient
args = sys.argv
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
mouth_cascade = cv2.CascadeClassifier('haarcascade_mcs_mouth.xml')
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
height = frame.shape[0]
width = frame.shape[1]
import sys
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
cv2.putText(frame, 'Please face in frame.', (350, 20), cv2.FONT_HERSHEY_PLAIN, 1.5, (0,255,0), thickness=2)
for (x,y,w,h) in faces:
roi_gray = gray[y:y+h, x:x+w]
roi_color = frame[y:y+h, x:x+w]
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
mouth = mouse_cascade.detectMultiScale(roi_gray)
for (ex,ey,ew,eh) in mouth:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,255),2)
cv2.putText(frame, 'Not masked!!', (10, 460), cv2.FONT_HERSHEY_DUPLEX, 1.0, (0,0,255), thickness=2)
resized_img = cv2.resize(frame,(width*2, height*2))
cv2.imshow('maskcheck', resized_img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
- Placez un script shell sur le bureau de RaspberryPi afin que le programme Python puisse être démarré.
- Assurez-vous de commencer par double-cliquer sur l'icône.
maskcheck.sh
#! /bin/bash
cd /home/pi/opencv_programs/
sudo python3 detect_face_camera.py
Tâche
- Il peut être difficile à détecter en raison de facteurs externes. (Distance à la face, angle, quantité de lumière, etc.) Le rideau est fermé car du bruit a été introduit en raison du contre-jour et il est devenu indétectable.
- Selon le type de masque et la façon dont il est porté, il peut ne pas être détecté comme un visage.
- Un endroit autre que la bouche peut être reconnu comme étant la bouche, probablement à cause du fichier en cascade de détection de la bouche. Il semble que le fichier en cascade puisse être modifié, il est donc possible de le résoudre en ajustant au fil du temps.
- Visage et reconnaissance → Puisque la logique est de reconnaître la présence ou l'absence de la bouche, il est nécessaire de faire reconnaître le visage en premier lieu. J'ai essayé la logique de reconnaissance buccale uniquement, mais cela n'a pas fonctionné. (Problème OpenCV?)
- Je suis curieux de savoir dans quelle mesure les performances peuvent être améliorées avec Raspberry Pi 4, où les retards de dessin sont perceptibles.