Cet article s'adresse aux personnes qui souhaitent reconnaître des visages avec OpenCV de Python. Dans cet article, j'expliquerai comment détecter un visage à partir d'une image, une image de caméra, un fichier mp4, et comment couper et enregistrer uniquement le visage de l'image.
macOS Catalina 10.15.4 Python 3.7.5 opencv-python 4.2.0.34 numpy 1.18.2
$ pip install opencv-python
.
├── cascades
│ └── haarcascade_frontalface_default.xml
├── image_detect.py
├── images
│ └── 001.jpg
├── trimmed
└── venv
La structure des répertoires est comme ça. Le détecteur de détection de visage dans le dossier cascades se trouve dans lib / python3.7 / site-packages / cv2 / data dans le répertoire où Python est installé ou dans le répertoire de l'environnement virtuel.
import cv2
cascade_path = "./cascades/haarcascade_frontalface_default.xml"
img_path = "./images/001.jpg "
color = (255, 255, 255) #La couleur du carré qui entoure le visage détecté
src = cv2.imread(img_path,0)
gray = cv2.cvtColor(src,cv2.cv2.COLOR_BAYER_BG2GRAY)
cascade = cv2.CascadeClassifier(cascade_path)
rect = cascade.detectMultiScale(gray)
if len(rect) > 0:
for x, y, w, h in rect:
cv2.rectangle(src, (x, y), (x+w, y+h), color)
cv2.imshow('detected', src)
cv2.waitKey(0)
cv2.destroyAllWindows()
x, y, w, h correspondent à la coordonnée x du coin supérieur gauche du visage, la coordonnée y du coin supérieur gauche du visage, la largeur du visage et la hauteur du visage. De plus, bien que non limité à OpenCV, l'origine des coordonnées xy est le coin supérieur gauche de l'image.
import cv2
cascade_path = "./cascades/haarcascade_frontalface_default.xml"
cascade = cv2.CascadeClassifier(cascade_path)
color = (255, 255, 255) #La couleur du carré qui entoure le visage détecté
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
rect = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=2, minSize=(30, 30))
if len(rect) > 0:
for x, y, w, h in rect:
cv2.rectangle(frame, (x, y), (x+w, y+h), color)
cv2.imshow('detected', frame)
key = cv2.waitKey(1)
if key == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Vous pouvez obtenir l'image de la caméra en définissant l'argument de cv2.VideoCapture () sur le numéro de périphérique de la caméra, mais vous pouvez également gérer le fichier vidéo en entrant le chemin du fichier mp4.
import cv2
cascade_path = "./cascades/haarcascade_frontalface_default.xml"
img_path = "./images/001.jpg "
out_path = "./trimmed/"
src = cv2.imread(img_path,0)
gray = cv2.cvtColor(src,cv2.cv2.COLOR_BAYER_BG2GRAY)
cascade = cv2.CascadeClassifier(cascade_path)
rect = cascade.detectMultiScale(gray)
if len(rect) > 0:
for i,[x, y, w, h] in enumerate(rect):
img_trimmed = src[y:y + h, x:x + w]
file_name = "{}.jpg ".format(i)
file_path = out_path + file_name
cv2.imwrite(file_path, img_trimmed)
Vous pouvez obtenir le nombre de boucles et le contenu de rect en même temps en utilisant enumerate dans l'instruction for. Lors de la coupe, sortez en tranche.
import cv2
import os
cascade_path = "./cascades/haarcascade_frontalface_default.xml"
img_path = "./images/"
out_path = "./trimmed/"
files = os.listdir(img_path)
cascade = cv2.CascadeClassifier(cascade_path)
for file in files:
src = cv2.imread(img_path+file,0)
gray = cv2.cvtColor(src,cv2.cv2.COLOR_BAYER_BG2GRAY)
rect = cascade.detectMultiScale(gray)
if len(rect) > 0:
for i,[x, y, w, h] in enumerate(rect):
img_trimmed = src[y:y + h, x:x + w]
file_name = "{}_{}".format(i,file)
file_path = out_path + file_name
cv2.imwrite(file_path, img_trimmed)
Si vous placez l'image que vous souhaitez rogner dans le dossier images et que vous l'exécutez, elle sera enregistrée dans le dossier rogné au format «{face index number} _ {original file name}».
OpenCV est pratique
Recommended Posts