Dieser Artikel richtet sich an Personen, die Gesichter mit OpenCV of Python erkennen möchten. In diesem Artikel werde ich erklären, wie man ein Gesicht aus einem Bild, einem Kamerabild, einer MP4-Datei erkennt und wie man nur das Gesicht aus dem Bild schneidet und speichert.
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
Die Verzeichnisstruktur ist wie folgt. Der Detektor für die Gesichtserkennung im Ordner cascades befindet sich in lib / python3.7 / site-packages / cv2 / data in dem Verzeichnis, in dem Python installiert ist, oder im Verzeichnis der virtuellen Umgebung.
import cv2
cascade_path = "./cascades/haarcascade_frontalface_default.xml"
img_path = "./images/001.jpg "
color = (255, 255, 255) #Die Farbe des Quadrats, das das erkannte Gesicht umgibt
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 entsprechen der x-Koordinate oben links im Gesicht, der y-Koordinate oben links im Gesicht, der Breite des Gesichts und der Höhe des Gesichts. Obwohl nicht auf OpenCV beschränkt, befindet sich der Ursprung der xy-Koordinaten oben links im Bild.
import cv2
cascade_path = "./cascades/haarcascade_frontalface_default.xml"
cascade = cv2.CascadeClassifier(cascade_path)
color = (255, 255, 255) #Die Farbe des Quadrats, das das erkannte Gesicht umgibt
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()
Sie können das Kamerabild abrufen, indem Sie das Argument von cv2.VideoCapture () auf die Gerätenummer der Kamera setzen. Sie können die Videodatei jedoch auch verarbeiten, indem Sie den Pfad zur mp4-Datei eingeben.
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)
Sie können die Anzahl der Schleifen und den Inhalt von rect gleichzeitig abrufen, indem Sie in der for-Anweisung enumerate verwenden. Beim Schneiden als Scheibe herausnehmen.
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)
Wenn Sie das Bild, das Sie zuschneiden möchten, in den Bilderordner legen und ausführen, wird es im zugeschnittenen Ordner im Format "{Gesichtsindexnummer} _ {ursprünglicher Dateiname}" gespeichert.
OpenCV ist praktisch
Recommended Posts