Ich habe mit openCV ein Programm erstellt, um Gesichter aus mehreren Bilddateien in einem Ordner zu erkennen, den Gesichtsteil auszuschneiden und das Bild zu speichern. Dies ist also eine Einführung. Im Folgenden finden Sie weitere Referenzartikel zu openCV.
Die Umweltzusammenfassung lautet wie folgt.
Unter Verwendung des im Artikel "OpenCV-Gesichtserkennung verwendet Parameter zur schnellen Verbesserung der Erkennungsgenauigkeit" erläuterten Codes werden der Name der Bilddatei, die Anzahl der Bilder, Die Parameter des trainierten Modells detelcMultiScale können zur Laufzeit angegeben werden. Ich habe mich gefragt, welche Quelldatei und Ausgabedatei anhand des Namens der Ausgabedatei identifiziert werden kann, aber ich habe aufgehört, weil es beim anschließenden Lernen mit tensorFlow im Weg zu stehen schien.
import cv2, os, argparse, shutil
#Verzeichnis zum Speichern des zugeschnittenen Bildes
SAVE_PATH = "./outputs/"
#Grundlegende Modellparameter
FLAGS = None
#Arten von trainierten Modellen
CASCADE = ["default","alt","alt2","tree","profile","nose"]
#Bestehen, wenn direkt ausgeführt(Importiert und nicht zur Laufzeit übergeben)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"--cascade",
type=str,
default="alt",
choices=CASCADE,
help="cascade file."
)
parser.add_argument(
"--scale",
type=float,
default=1.3,
help="scaleFactor value of detectMultiScale."
)
parser.add_argument(
"--neighbors",
type=int,
default=2,
help="minNeighbors value of detectMultiScale."
)
parser.add_argument(
"--min",
type=int,
default=80,
help="minSize value of detectMultiScale."
)
parser.add_argument(
"--input_dir",
type=str,
default="./input/",
help="The path of input directory."
)
parser.add_argument(
"--move_dir",
type=str,
default="/done/",
help="The path of moving detected files."
)
#Parametererfassung und -ausführung
FLAGS, unparsed = parser.parse_known_args()
#Sortierverzeichnis(Erhalten von)
# https://github.com/opencv/opencv/blob/master/data/haarcascades/
# https://github.com/opencv/opencv_contrib/blob/master/modules/face/data/cascades/
#Geschulte Modelldatei
if FLAGS.cascade == CASCADE[0]:#"default":
cascade_path = "./models/haarcascade_frontalface_default.xml"
elif FLAGS.cascade == CASCADE[1]:#"alt":
cascade_path = "./models/haarcascade_frontalface_alt.xml"
elif FLAGS.cascade == CASCADE[2]:#"alt2":
cascade_path = "./models/haarcascade_frontalface_alt2.xml"
elif FLAGS.cascade == CASCADE[3]:#"tree":
cascade_path = "./models/haarcascade_frontalface_alt_tree.xml"
elif FLAGS.cascade == CASCADE[4]:#"profile":
cascade_path = "./models/haarcascade_profileface.xml"
elif FLAGS.cascade == CASCADE[5]:#"nose":
cascade_path = "./models/haarcascade_mcs_nose.xml"
#Ermitteln Sie die Merkmalsmenge des Kaskadenklassifikators
faceCascade = cv2.CascadeClassifier(cascade_path)
#Anzahl erfolgreicher Gesichtserkennungen(Geben Sie standardmäßig 0 an)
face_detect_count = 0
#Anzahl der Gesichtserkennungsfehler(Geben Sie standardmäßig 0 an)
face_undetected_count = 0
#Speichern Sie Dateien in Ordnern in Variablen(Speichert auch Verzeichnisse)
files = os.listdir(FLAGS.input_dir)
#Wenn Sie die Erfolgsdatei nicht verschoben haben, löschen Sie das Ausgabeverzeichnis und erstellen Sie es neu, falls vorhanden
if FLAGS.move_dir == "":
if os.path.exists(SAVE_PATH):
shutil.rmtree(SAVE_PATH)
os.mkdir(SAVE_PATH)
print(FLAGS)
#Wenn aus den gesammelten Bilddaten ein Gesicht erkannt wird, schneiden Sie es aus und speichern Sie es.
for file_name in files:
#Für Dateien(Wenn nicht ein Verzeichnis)
if os.path.isfile(FLAGS.input_dir + file_name):
#Lesen der Bilddatei
img = cv2.imread(FLAGS.input_dir + file_name)
#Da es Dateien gibt, die bei einer großen Anzahl von Bildern selten fehlschlagen, protokollieren Sie die Ausgabe und überspringen Sie sie(Ursache unbekannt)
if img is None:
print(file_name + ':Cannot read image file')
continue
#Von Farbe in Graustufen konvertieren(Weil das Gesicht nicht durch Farbe erkannt wird)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Gesichtserkennung
face = faceCascade.detectMultiScale(gray, scaleFactor=FLAGS.scale, minNeighbors=FLAGS.neighbors, minSize=(FLAGS.min, FLAGS.min))
if len(face) > 0:
for rect in face:
#Bildausgabe zuschneiden
cv2.imwrite(SAVE_PATH + str(face_detect_count) + file_name, img[rect[1]:rect[1] + rect[3], rect[0]:rect[0] + rect[2]])
face_detect_count = face_detect_count + 1
#Verschieben Sie die erkannte Datei
if FLAGS.move_dir != "":
shutil.move(FLAGS.input_dir + file_name, FLAGS.input_dir + FLAGS.move_dir)
else:
print(file_name + ':No Face')
face_undetected_count = face_undetected_count + 1
print('Undetected Image Files:%d' % face_undetected_count)
Bitte erstellen Sie die Ein- und Ausgabeordner direkt unter der Ausführung und legen Sie die Bilder im Eingabeordner ab. Führen Sie es in der Befehlszeile aus. Da der Anfangswert angegeben ist, müssen Sie keine Parameter angeben.
python openCVCutAndSave01_20170804.py
Natürlich können Sie auch Parameter angeben und ausführen.
python openCVCutAndSave01_20170804.py --cascade "alt" --image_file "cut_source" --image_count 4 --scale 1.1 --neigbors 3 --min 50
Das Bild im Eingabeordner wird ausgeschnitten und in den Ausgabeordner ausgegeben, und das Bild, dessen Gesicht erkannt werden kann, wird in den Ordner "Fertig" verschoben. Bei der Verarbeitung einer großen Anzahl von Bildern ist es zweckmäßig, die Ordner nach Vorhandensein oder Nichtvorhandensein einer Erkennung zu unterteilen. Daher haben wir diese Spezifikation vorgenommen. Details finden Sie im Artikel "Tipps zum effizienten Erkennen von Gesichtern in einer großen Anzahl von Bildern mit openCV".
Recommended Posts