[PYTHON] Ich möchte die Position meines Gesichts mit OpenCV überprüfen!

Einführung

Wenn Sie ein Programm ausführen, das Ihre Eingaben ausgibt, z. B. ein Spiel "Ich wünschte ich könnte das Gesicht erkennen und es bedienen?" Ich habe darüber nach gedacht. Also habe ich ein Programm erstellt, das OpenCV verwendet, um auf die Position des Gesichts zu reagieren und von dort aus den Mittelpunkt des Gesichts zu finden. Selbst wenn ich das denke, ist es bedeutungslos, wenn ich es mit einem Standbild vor dem Programm, das das Video verarbeitet, nicht richtig erkennen kann. Deshalb habe ich ein Programm erstellt, das das Foto verarbeiten kann, und es dann ermöglicht, es mit dem Video zu verarbeiten.

Erstellungsübersicht

Geben Sie die Position des Gesichts mit OpenCV an

Entwicklungsumgebung

MacBookPro 2019 2,4 GHz Core i5-Speicher 16 GB OS:macOS Mojave10.14.6 Python(anaconda)

Inhalt

Es erfasst ein Gesicht mithilfe der OpenCV-Bibliothek und gibt die Koordinatenpunkte des Fotos aus.

Lesen Sie das Bild

Vorerst habe ich mit einer bereits vorhandenen Bibliothek etwas erstellt, das ein Gesicht spezifiziert, ohne darüber nachzudenken.

Face_photo.ipynb


import cv2
import matplotlib.pyplot as plt

image_name = input("File Name?")

src=cv2.imread(image_name)
image_gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #Graustufen
color=(0,0,255) #Kakomu Typ(rot)
color_c=(255,0,0) #Derjenige, der trifft(Punkt,Blau)
cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml") #Import von Trainingsdaten

#Finde ein Gesicht
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(50,50))

if len(facerect) > 0:
    for rect in facerect:
        cv2.rectangle(src,tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]),color,thickness = 2) #Linie um das Gesicht
        cv2.circle(src,tuple(rect[0:2]+rect[2:4]//2),5,color_c,thickness=-10) #Punkt in der Mitte
        print(rect[0:2]+rect[2:4]//2)#Den Mittelpunkt ausgeben

cv2.imwrite(image_name+"_result.jpg ",src)#Derjenige, der gerettet werden soll

Auf diese Weise können Sie Punkte auf Ihrem Gesicht zeichnen. Infolgedessen sieht es so aus. baby0FTHG7355_TP_V.jpg (Originalfoto) baby0FTHG7355_TP_V.jpg_result.jpg (Ausgabeergebnis)

Ich glaube, ich konnte es auf gute Weise festhalten.

Problem

Bei dieser Methode gab es jedoch die folgenden Probleme. EJ0zkEnUwAACV5f.jpeg Wenn Sie das Loch in der Nase und den Nasenboden als Nase betrachten, ist es ein Gesicht (Kippari)

Ich kann nichts sagen, also muss ich das auch beheben.

Beurteile das größte Gesicht

Lassen Sie uns diesmal mit dem Körper darüber nachdenken, dass wir eine Person erkennen sollten. Der Grund dafür ist, dass das ultimative Ziel darin besteht, mit dem Gesicht zu operieren, sodass nicht viele Menschen angenommen werden müssen. Lassen Sie uns also nur das große Gesicht erkennen.

Face_Photo.ipynb


import cv2
import matplotlib.pyplot as plt

image_name = input("File Name?")

# image_name = "27708.jpg " #Fotos aufnehmen

src=cv2.imread(image_name)
image_gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #Graustufen
color=(0,0,255) #Kakomu Typ(rot)
color_c=(255,0,0) #Derjenige, der trifft(Punkt,Blau)

big_face=(0,0,0,0)

cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml") #Import von Trainingsdaten

#Ein Zauber zum Verwalten
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(50,50))

if len(facerect) > 0:
    for rect in facerect:
        print(rect)
        if(big_face[2]<rect[2]):
            big_face= rect

cv2.rectangle(src,tuple(big_face[0:2]),tuple(big_face[0:2]+big_face[2:4]),color,thickness = 2) #Linie um das Gesicht
cv2.circle(src,tuple(big_face[0:2]+big_face[2:4]//2),5,color_c,thickness=-10) #Punkt in der Mitte
print("Ergebnis:%d" + (big_face[0:2]+big_face[2:4]//2))#Den Mittelpunkt ausgeben

cv2.imwrite(image_name+"_result.jpg ",src)#Derjenige, der gerettet werden soll

Ich beschloss, das größte Gesicht in etwas namens big_face zu speichern. Es klingt wie ein schlechtes Wort, ist es aber nicht. Natürlich ist dies jetzt ein guter Weg, um Ihr größtes Gesicht zu retten.

Mit Video erkennen

Zu diesem Zeitpunkt ist es die Endphase. Ich habe es mit Video zum Laufen gebracht.

Face_Video.ipynb


import cv2
import matplotlib.pyplot as plt

# image_name = input("File Name?")

# image_name = "27708.jpg " #Fotos aufnehmen

cap=cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,480)

while True:
    ret,src=cap.read()

    if not ret:
        print("Couldn't detect camera.")
        break

    key=cv2.waitKey(1)&0xff
    if key==ord("q"):
        print("Given a exit command.")
        break
        
    image_gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #Graustufen
    color=(0,0,255) #Kakomu Typ(rot)
    color_c=(255,0,0) #Derjenige, der trifft(Punkt,Blau)

    big_face=(0,0,0,0)

    cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml") #Import von Trainingsdaten

    #Ein Zauber zum Verwalten
    facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(50,50))

    if len(facerect) > 0:
        for rect in facerect:
            if(big_face[2]<rect[2]):
                big_face= rect

        cv2.rectangle(src,tuple(big_face[0:2]),tuple(big_face[0:2]+big_face[2:4]),color,thickness = 2) #Linie um das Gesicht
        cv2.circle(src,tuple(big_face[0:2]+big_face[2:4]//2),5,color_c,thickness=-10) #Punkt in der Mitte
        print(big_face[0:2]+big_face[2:4]//2)#Den Mittelpunkt ausgeben

    cv2.imshow("result",src)
    cv2.waitKey(1)
    
cv2.destroyAllWindows()
cap.release()

Wenn Sie es bisher schaffen, sieht es wie folgt aus. 名称未設定-1.gif Jetzt funktioniert es richtig. Darüber hinaus kann die Position der Nase selbst hier auch als numerischer Wert ausgegeben werden. Wenn Sie diesen verwenden, können Sie an der Position des Gesichts arbeiten. Übrigens habe ich eingefügt, dass es endet, wenn ich q drücke, aber es hat nicht mit jupyter geantwortet. Trauer.

Problem

Es gibt jedoch ein Problem mit dieser Methode, und sie reagiert nicht, wenn es sich um ein Profil handelt. Dies bedeutet nicht, dass das Profil Shinkansen ist, aber es gibt ein Problem, dass es nicht reagiert, da es sich um die Daten handelt, die in erster Linie über die Vorderseite gelernt wurden. Wenn Sie also eine Kamera und einen Bildschirm vollständig vor sich haben und diese in einem Spiel verwenden, können Sie sie meiner Meinung nach voll ausnutzen.

Das war's für die Gesichtserfassung mit OpenCV.

Ergänzung

Für alle Bilder, die dieses Mal verwendet wurden, habe ich die Bilder von Pakutaso verwendet.

Recommended Posts

Ich möchte die Position meines Gesichts mit OpenCV überprüfen!
Ich möchte meine Gefühle mit den Texten von Mr. Children ausdrücken
Ich möchte Objekte mit OpenCV erkennen
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich möchte das automatische Löschen des tmp-Bereichs in RHEL7 stoppen
Ich möchte das Ausführungsergebnis von strace erfassen
Ich möchte mit Python-Datenklasse nach hinten erben
Ich möchte die Grundlagen von Bokeh vollständig verstehen
Ich möchte das Bild entlang der Kontur anstelle des Rechtecks zuschneiden [Python OpenCV]
Ich möchte die Sicherheit der SSH-Verbindung erhöhen
Ich möchte die Standortinformationen von GTFS Realtime auf Jupyter zeichnen! (Mit Ballon)
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich möchte eine andere Version von Python mit pyvenv angeben
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich möchte nur die SudachiPy-Normalisierungsverarbeitung verwenden
Ich möchte Betriebsinformationen über die Yahoo-Route erhalten
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Ich möchte mit Numpy die japanische Flagge in die Palau-Flagge ändern
Ich möchte mit GAN Schwarzweißfotos von Erinnerungen ausmalen
[Python] Ich möchte die Option -h mit argparse verwenden
Ich möchte die Authentizität eines Elements eines numpy-Arrays bestimmen
Ich möchte die Natur von Python und Pip kennenlernen
Keras Ich möchte die Ausgabe einer beliebigen Ebene erhalten !!
Ich möchte die Legende der IT-Technologiewelt kennenlernen
Ich möchte mit Python debuggen
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Ich habe versucht, den Stromverbrauch meines Hauses mit Nature Remo E lite zu visualisieren
Ich möchte den Namen der ausgeführten Funktion / Methode erhalten
[Pytorch] Ich möchte die Trainingsparameter des Modells manuell zuweisen
Ich möchte das Wetter mit LINE bot feat.Heroku + Python wissen
Machen Sie sich mit der Pipeline von spaCy vertraut (wollen Sie es sein)
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
LINEbot-Entwicklung möchte ich den Betrieb in der lokalen Umgebung überprüfen
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Vorerst möchte ich jede Datei mit ffmpeg konvertieren !!
Ich habe den Befehl worldcup verwendet, um das Ergebnis der Weltmeisterschaft zu überprüfen.
Ich möchte die Bevölkerung jedes Landes der Welt kennenlernen.
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich möchte Spyder an die Taskleiste anheften
Ich möchte kühl auf die Konsole ausgeben
Ich habe die Optionen von copyMakeBorder von OpenCV überprüft
So überprüfen Sie die Version von Django
Ich möchte mit dem Reim Teil1 umgehen
Ich möchte mit Python eine beliebige URL aus der Zeichenfolge der HTML-Quelle extrahieren
Ich möchte einen Blog mit Jupyter Notebook schreiben
Überprüfen Sie die Existenz der Datei mit Python
Ich möchte mit dem Reim part3 umgehen
Ich möchte eine Pip-Installation mit PythonAnywhere durchführen
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
Ich möchte den Fortschrittsbalken anzeigen
[Twitter] Ich möchte die heruntergeladenen vergangenen Tweets (meines Kontos) in eine schöne CSV verwandeln
Ich möchte mit dem Reim part2 umgehen
Ich möchte mit dem Reim part5 umgehen
Ich möchte mit dem Reim part4 umgehen
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren