[PYTHON] Versuchen Sie die Gesichtserkennung in Echtzeit mit einer Webkamera

Einführung

Ich habe eine Software namens motion auf Raspberry PI installiert und sie als Überwachungskamera verwendet, um zu identifizieren, wer die Person auf dem Bild ist, aber sie ist etwas unbefriedigend, da sie nur anhand des gespeicherten Standbilds identifiziert wird. Um diese Zeit.

Da es eine große Sache war, fragte ich mich, ob ich etwas tun könnte, indem ich das Video in Echtzeit verarbeite und Informationen sammle. Da es jedoch einen Artikel gab, der verwandt zu sein scheint, habe ich ein Skript erstellt, um das Gesicht in Echtzeit zu erkennen, während ich darauf Bezug nahm.

Versuchen Sie, Webkamera- / Videokamera-Videos in Echtzeit mit OpenCV zu konvertieren

OpenCV-Installation

Dies ist Miso. Informationen zur Installation finden Sie im folgenden Artikel.

Verfahren zum schnellen Erstellen einer Deep-Learning-Umgebung auf einem Mac mit TensorFlow und OpenCV

Kopieren Sie außerdem den für die Gesichtserkennung verwendeten Klassifizierer mit dem folgenden Befehl in den Arbeitsordner.

$ cp /usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt2.xml ./

Ein Skript erstellen

Das auf der Referenzseite veröffentlichte Skript wurde wie folgt geändert.

sebcam.py


import cv2

if __name__ == '__main__':
    #Konstante Definition
    ESC_KEY = 27     #Esc-Taste
    INTERVAL= 33     #Wartezeit
    FRAME_RATE = 30  # fps

    ORG_WINDOW_NAME = "org"
    GAUSSIAN_WINDOW_NAME = "gaussian"

    DEVICE_ID = 0

    #Bezeichnung des Klassifikators
    cascade_file = "haarcascade_frontalface_alt2.xml"
    cascade = cv2.CascadeClassifier(cascade_file)
    
    #Kamerabilderfassung
    cap = cv2.VideoCapture(DEVICE_ID)

    #Laden des ersten Frames
    end_flag, c_frame = cap.read()
    height, width, channels = c_frame.shape

    #Fenstervorbereitung
    cv2.namedWindow(ORG_WINDOW_NAME)
    cv2.namedWindow(GAUSSIAN_WINDOW_NAME)

    #Konvertierungsverarbeitungsschleife
    while end_flag == True:

        #Bildaufnahme und Gesichtserkennung
        img = c_frame
        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        face_list = cascade.detectMultiScale(img_gray, minSize=(100, 100))
        
        #Markieren Sie das erkannte Gesicht
        for (x, y, w, h) in face_list:
            color = (0, 0, 225)
            pen_w = 3
            cv2.rectangle(img_gray, (x, y), (x+w, y+h), color, thickness = pen_w)
        
        #Rahmenanzeige
        cv2.imshow(ORG_WINDOW_NAME, c_frame)
        cv2.imshow(GAUSSIAN_WINDOW_NAME, img_gray)

        #Beenden Sie mit der Esc-Taste
        key = cv2.waitKey(INTERVAL)
        if key == ESC_KEY:
            break

        #Lesen Sie den nächsten Frame
        end_flag, c_frame = cap.read()

    #Verarbeitung beenden
    cv2.destroyAllWindows()
    cap.release()

Funktionsprüfung

Wenn Sie den folgenden Befehl ausführen, werden zwei Fenster angezeigt, und Sie sollten das Originalbild und die Graustufen mit einem auf dem Gesicht gezeichneten Quadrat sehen.

python


$ python sebcam.py

Es wurde gemacht (^ - ^) /

Bonus (optischer Fluss)

Es gab auch ein Beispiel, das ein in Echtzeit erkanntes Objekt verfolgt, also habe ich es versucht.

Zeichnen Sie den optischen Fluss in Echtzeit mit OpenCV (Shi-Tomasi-Methode, Lucas-Kanade-Methode)

Da die Video-Lesequelle des Referenzziels eine Videodatei war, habe ich diese in eine Webkamera geändert. Und wenn die erkannten Merkmalspunkte verschwinden, wird sie geändert, um erneut erkannt zu werden.

LucasKande.py


import numpy as np
import cv2

DEVICE_ID = 0
cap = cv2.VideoCapture(DEVICE_ID)

# Shi-Tomasi-Eckenerkennungsparameter
feature_params = dict( maxCorners = 100,
                       qualityLevel = 0.3,
                       minDistance = 7,
                       blockSize = 7 )

# Lucas-Parameter der Kanade-Methode
lk_params = dict( winSize  = (15,15),
                  maxLevel = 2,
                  criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

#Generieren Sie 100 Farben nach dem Zufallsprinzip (generieren Sie ein zufälliges ndarray mit 100 Zeilen und 3 Spalten im Bereich von 0 bis 255).
color = np.random.randint(0, 255, (100, 3))

#Verarbeitung des ersten Frames
end_flag, frame = cap.read()
gray_prev = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
feature_prev = cv2.goodFeaturesToTrack(gray_prev, mask = None, **feature_params)
mask = np.zeros_like(frame)

while(end_flag):
    #In Graustufen konvertieren
    gray_next = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    #Optische Durchflusserkennung
    feature_next, status, err = cv2.calcOpticalFlowPyrLK(gray_prev, gray_next, feature_prev, None, **lk_params)

    if len(feature_next[status == 1]) == 0:
        feature_prev = cv2.goodFeaturesToTrack(gray_prev, mask = None, **feature_params)
        mask = np.zeros_like(frame)
        feature_next, status, err = cv2.calcOpticalFlowPyrLK(gray_prev, gray_next, feature_prev, None, **lk_params)

    #Wählen Sie Merkmalspunkte aus, für die ein optischer Fluss erkannt wurde (0: nicht erkannt, 1: erkannt).
    good_prev = feature_prev[status == 1]
    good_next = feature_next[status == 1]
    
    #Optischen Fluss zeichnen
    for i, (next_point, prev_point) in enumerate(zip(good_next, good_prev)):
        prev_x, prev_y = prev_point.ravel()
        next_x, next_y = next_point.ravel()
        mask = cv2.line(mask, (next_x, next_y), (prev_x, prev_y), color[i].tolist(), 2)
        frame = cv2.circle(frame, (next_x, next_y), 25, color[i].tolist(), -1)
    img = cv2.add(frame, mask)

    #Im Fenster anzeigen
    cv2.imshow('window', img)

    #Drücken Sie die ESC-Taste, um den Vorgang abzuschließen
    if cv2.waitKey(30) & 0xff == 27:
        break

    #Vorbereitung des nächsten Rahmens und Punktes
    gray_prev = gray_next.copy()
    feature_prev = good_next.reshape(-1, 1, 2)
    end_flag, frame = cap.read()

#Verarbeitung beenden
cv2.destroyAllWindows()
cap.release()

erledigt!

Recommended Posts

Versuchen Sie die Gesichtserkennung in Echtzeit mit einer Webkamera
Gesichtserkennung mit einem Kaskadenklassifikator
Versuchen Sie, Videos mit OpenCV in Echtzeit zu konvertieren
Zusammenfassung der Gesichtserkennung in Python
Versuchen Sie, ein neuronales Netzwerk in Python aufzubauen, ohne eine Bibliothek zu verwenden
Versuchen Sie, eine in Python geschriebene Funktion mit Fn Project auszuführen
Versuchen Sie es mit Spyder, das in Anaconda enthalten ist
Erstellen Sie mit TensorFlow eine Gesichtserkennung
Versuchen Sie es mit LevelDB mit Python (plyvel)
Versuchen Sie es mit LeapMotion mit Python
Verwenden einer Webkamera mit Raspberry Pi
Versuchen Sie vorerst, FireBase Cloud Firestore mit Python zu verwenden
So erstellen Sie mit YOLO in 3 Stunden ein Modell für die Objekterkennung
Ich habe versucht, Gitarrenakkorde in Echtzeit mithilfe von maschinellem Lernen zu klassifizieren
[Python] [Word] [python-docx] Versuchen Sie, mit python-docx eine Vorlage für einen Wortsatz in Python zu erstellen
Ein nützlicher Hinweis, wenn Sie Python nach langer Zeit verwenden
Versuchen Sie, die Kraken-API mit Python zu verwenden
Versuchen Sie, das HL-Band der Reihe nach zu verwenden
Versuchen Sie, ein SYN-Paket in Python zu senden
Versuchen Sie, eine einfache Animation in Python zu zeichnen
Probieren Sie schnell die Microsoft Face API in Python aus
Versuchen Sie es mit einer probabilistischen Programmiersprache (Pyro).
Zeichnen Sie mit graphviz eine Baumstruktur in Python 3
Probieren Sie eine funktionale Programmierpipe in Python aus
Versuchen Sie es mit Platypus, einer Mehrzweckoptimierungsbibliothek
Erstellen Sie in kürzester Zeit eine LAMP-Umgebung
Erstellen Sie eine GIF-Datei mit Pillow in Python
Berechnen wir das statistische Problem mit Python
Verstärkungslernen 10 Versuchen Sie es mit einem trainierten neuronalen Netz.
Versuchen Sie, Blueprint with Flask zu verwenden, um Controller zu trennen
Versuchen Sie, QR-Code mit Raspberry Pi zu verwenden
Versuchen Sie es mit der BitFlyer Ligntning API in Python
Versuchen Sie es mit Sourcetrail, einem Quellcode-Visualisierungstool
Eine clevere Möglichkeit zur Zeitverarbeitung mit Python
Lesen Sie die Ausgabe von subprocess.Popen in Echtzeit
Anzeigen von Arzneimittelbewertungen mithilfe von Listen in Python
Versuchen Sie es vorerst mit LINE Notify
Versuchen Sie, ein Konturdiagramm mit matplotlib mit OpenFOAM zu zeichnen
Versuchen wir die Echtzeit-Objekterkennung mit Faster R-CNN
Implementieren Sie eine ähnliche Gesichtssuche in einem halben Tag
Tipps für eine gute Verwendung von Elastic Search
Erstellen Sie eine MIDI-Datei in Python mit pretty_midi
Ich habe einen japanischen Parser auf Japanisch mit Pyparsing geschrieben.
Zeichnen Sie YouTube-Aufrufe mit Lambda in einer Tabelle auf
Versuchen Sie es mit einer objektorientierten Klasse in R (R6-Methode)
Versuchen Sie, die ChatWork-API und die Qiita-API in Python zu verwenden
Versuchen Sie, die DropBox Core-API mit Python zu verwenden
Jedes Mal, wenn ich versuche, eine CSV-Datei mit Pandas zu lesen, wird ein numpy-Fehler angezeigt.
So testen Sie eine Funktion, die die aktuelle Zeit enthält, mit Freezegun in Python
Speichern Sie Ihre Herzfrequenz in Echtzeit (?) Mit der Python x Fitbit API in SpreadSheets!
Ein Skript, das Tweets mit bestimmten Schlüsselwörtern auf Twitter in Echtzeit an Slack überträgt.
Vorhersage aus verschiedenen Daten in Python mit dem Zeitreihen-Vorhersage-Tool Facebook Prophet