Gesichts- und Bewegungserkennung mit Computer Vision

Gesichts- und Bewegungserkennung mit Computer Vision
OpenCV (Open Source Computer Vision Library) ist ein Python -Modul, das für Computer Vision verwendet wird. Es ist ein immenses Modul mit außergewöhnlichen Fähigkeiten. Wir können viele Dinge mit Computer Vision tun, und einige der größten sind Gesichtserkennung und Bewegungserkennung.

In diesem Tutorial lernen Sie, Code zu schreiben, um Gesichter in Bildern, Videos und Bewegungen zu erkennen.

Um alle möglichen Fehler und Probleme zu vermeiden, werden wir die OpenCV -Datei von GitHub unter https: // github herunterladen.com/opencv/opencv. Wir werden einige der in sich befindlichen Dateien verwenden, um den Code zu vervollständigen.

Gesichtserkennung mit Bildern

In der GitHub OpenCV-Datei befindet sich ein Unterdirektor. Wir werden Fotos und Videos in diesem Verzeichnis verwenden. Insbesondere werde ich die Lena benutzen.JPG -Datei. Ich werde es kopieren und in mein Pycharm -Arbeitsverzeichnis einfügen (in meinem Fall ist es C: \ Benutzer \ Never \ PycharmProjects \ PythonProject). Lassen Sie uns nun auf diesem Bild die Gesichtserkennung beginnen.

Lassen Sie uns zunächst die Module, die wir brauchen, laden:

Numph als NP importieren
CV2 importieren

Die von uns verwendete Datei befindet sich unter openCV-master \ data \ haarcascades \ haarcascade_frontalface_default.XML der von GitHub heruntergeladenen Datei. Wir müssen einen Link zur Haarcascade -Datei wie folgt stellen:

face_cascade = cv2.CascadeClassifier ('C: \\ Benutzer \\ nie \\ downloads \\ opencv-master \\ data \\ haarcascades \\ haarcascade_frontalface_default.xml ')

Laden Sie das Foto, um die Gesichtserkennung mit dem CV2 durchzuführen.Imread () Methode.

Bild = CV2.Imread ('Lena.JPG ')

Unser nächstes Ziel ist es, das Foto in Graustufen umzuwandeln. Letzteres erfolgt mit dem CV2.cvtcolor () Methode. Diese Methode nimmt zwei Argumente an. Das erste Argument ist der Name der zu konvertierenden Datei, und das zweite Argument ist das Conversion -Format. In diesem Fall werden wir CV2 verwenden.Color_bgr2gray, um es in ein Graustufenformat umzuwandeln.

grau = cv2.cvtcolor (Bild, CV2.Color_bgr2gray)

Wir verwenden dann die Funktion von DEPECTMULTMULTICSISCALE (), um Objekte zu erkennen, oder in diesem Fall Gesichter. Hier werden wir Python Face_cascade erzählen.detectMultiscale (), das Gesichter erfasst, da dies für den Parameter face_cascade ist. Die Funktion DECTECTMULTISCALE () nimmt einige Argumente, das Bild, einen Skalierungsfaktor, die Mindestanzahl von Nachbarn, Flaggen, Mindestgröße und maximale Größe.

faces = face_cascade.DECTECTMULTISCALE (GRAU, 1.5, 5)

Um eine rechteckige Schachtel um das Gesicht zu legen, müssen wir den CV2 verwenden.Rechteck () Methode. Mit dieser Methode müssen wir ein paar Argumente vorlegen. Das erste Argument ist das Bild, das Sie möchten, das zweite Argument ist der Startpunkt des Rechtecks, das dritte Argument ist der Endpunkt des Rechtecks, das vierte Argument ist die Farbe des Rechtecks ​​und das fünfte Argument ist die Dicke von Dicke von die Linie. In diesem Fall ist W für Breite, H für die Höhe und x und y sind der Ausgangspunkt.

für (x, y, w, h) in Gesichtern:
CV2.Rechteck (Bild, (x, y), (x+w, y+h), (0,255,0), 3)

Zuletzt zeigen wir das Bild mit dem CV2.IMshow () Methode. Wir verwenden auch den CV2.Waitkey (0), um eine unendliche Wartezeit festzulegen und den CV2 zu verwenden.DestroyAllWindows () -Methode zum Schließen des Fensters.

CV2.IMshow ('Bild', Bild)
CV2.Waitkey (0)
CV2.zerstörerndenwindows ()

Gesichtserkennung mithilfe von Videos/Webcam

In diesem Fall werden wir mit einer Webcam oder einem Video Gesichter in Echtzeit in Echtzeit erkennen. Noch einmal beginnen wir mit dem Importieren der erforderlichen Module.

Numph als NP importieren
CV2 importieren

Als nächstes müssen wir den Ort der Haarcascade -Dateien angeben. Wir tun dies wie folgt (genau wie für das Bild):

face_cascade = cv2.CascadeClassifier ('C: \\ Benutzer \\ nie \\ downloads \\ opencv-master \\ data \\ haarcascades \\ haarcascade_frontalface_default.xml ')

Jetzt müssen wir das Video angeben, mit dem wir mit dem CV2 zu tun haben möchten.Videocapture () Methode. In meinem Fall habe ich mich für ein Video entschieden, das ich hatte, und habe den Namen des Videos eingegeben. Wenn Sie sich mit Webcams befassen möchten, würden Sie eine 0 anstelle des Namens der Videodatei einfügen.

Video = CV2.VideoCapture ("Video.MP4 ")

Wir beginnen dann eine Weile Schleife. Wenn wir wahr sind, bitten wir das Programm, die Gesichter zu erkennen, bis wir es anhielten. In der ersten Instanz lesen wir die Videodatei mit der Funktion read ().

während wahr:
ret, Bild = Video.lesen()

Genau wie im vorherigen Abschnitt müssen wir die Bilder oder Rahmen in Graustufen umwandeln, um die Erkennung zu erleichtern. Wir verwenden den CV2.cvtcolor () Methode, um die Rahmen in Grau zu ändern.

grau = cv2.cvtcolor (Bild, CV2.Color_bgr2gray)

Um die Gesichter zu erkennen. Wiederum dauert es die gleichen Parameter wie im vorherigen Abschnitt.

faces = face_cascade.DECTECTMULTISCALE (GRAU, 1.1, 4)

Um Rechtecke um die Gesichter zu platzieren, verwenden wir den CV2.Rechteck () Methode. Dies ähnelt dem vorherigen Abschnitt.

für (x, y, w, h) in Gesichtern:
CV2.Rechteck (Bild, (x, y), (x+w, y+h), (255, 0, 0), 2)

Wir zeigen dann die Frames mit dem CV2.IMshow () Methode. Diese Methode nimmt zwei Argumente auf.

CV2.IMshow ('Bild', Bild)

Wir setzen dann eine Klausel ein, wenn der Benutzer die ESC -Taste (oder 27) drückt, wird der Code aus der Schleife ausgebrochen.

Wenn CV2.WaitKey (0) & 0xff == 27:
brechen

Schließlich veröffentlichen wir das Video mit der Funktion release ().

Video.freigeben()

Bewegungserkennung

Die Bewegungserkennung ist großartig! Was es bedeutet, ist, dass wir mit Python und einer guten Webcam unsere eigene Sicherheitskamera erstellen können! Also beginnen wir beginnen.

Numph als NP importieren
CV2 importieren

Ich werde ein Video aus den Proben (OpenCV-Master \ Samples \ Data) der GitHub-Datei auswählen.

Video = CV2.Videokapiture ("Vtest.avi ")

Um Bewegung zu erfassen, ist das, worauf wir uns im Grunde genommen verlassen. Wir erstellen also zwei Bilder, Frame1 und Frame2.

ret, Frame1 = Video.lesen()
ret, Frame2 = Video.lesen()

Während das Video geöffnet wird oder die Funktion isopened () verwendet, beginnen wir eine Schleife.

während Video.ist geöffnet():

Wir berechnen zunächst die absolute Differenz zwischen Frame1 und Frame2 mit dem CV2.Absdiff () Methode. Offensichtlich braucht es zwei Argumente, die ersten und zweiten Frames.

Differenz = CV2.Absdiff (Frame1, Frame2)

Da die Dinge in Schwarz und Weiß leichter sind, werden wir den Unterschied mit dem CV2 in Graustufen verwandeln.cvtcolor () Methode. Der CV2.cvtcolor () Methode nimmt zwei Argumente an, der erste ist der Rahmen oder das Bild, und die zweite ist die Transformation. In diesem Fall werden wir CV2 verwenden.Color_bgr2gray.

grau = cv2.CVTColor (Differenz, CV2.Color_bgr2gray)

Sobald sich das Bild in Graustufen befindet, müssen wir das Bild als nächstes verwischen, um das Rauschen mit dem CV2 zu entfernen.Gaußsianblur () Methode. Der CV2.Gaußsianblur () Methode nimmt einige Argumente ein-das Quellbild zum Blur, das Ausgabebild, die Gaußsche Kernelgröße, die Kernelstandardabweichung entlang der X-Achse, die Kernelstandardabweichung entlang der Y-Achse und Grenztyp.

Blur = CV2.Gaußsianblur (Grau, (5,5), 0)

Als nächstes setzen wir einen Schwellenwert mit dem CV2.Schwelle () Methode. Diese Technik wird die Bewegung durch Segmentierung des Hintergrunds und des Vordergrunds (oder der Bewegung) isolieren. Der CV2.Die Methode der Schwelle () nimmt vier Argumente ein: das Bild, den Schwellenwert, der Maximalwert, der mit Thresh_Binary und Thresh_Binary_inv und dem Schwellenwerttyp verwendet werden kann.

_, Schwelle = CV2.Schwelle (Blur, 20, 255, CV2.Thresh_Binary)

Als nächstes erweitern wir mit dem CV2.Dilate () -Methode, die maximal 6 Argumente einnimmt: das Bild, den Kernel, den Anker, die Iterationen, der Grenztyp und den Randwert.

erweitern = cv2.erweitern (Schwellenwert, keine, Iterationen = 3)

Der CV2.FindContours () -Methode macht genau das, was sie bedeutet, sie findet Konturen. Es werden drei Argumente erforderlich.

Kontur, _ = CV2.FindContours (Dilat, CV2.Retr_tree, v2.Chain_approx_simple)

Der CV2.DrawContours () -Methode wird verwendet, um die Konturen zu zeichnen. Es dauert einige Argumente: das Bild, die Konturen, das contourIdx (dieser Wert ist negativ, wenn alle Konturen gezeichnet werden), die Farbe, die Dicke, der Linientyp, die Hierarchie, die maximale Ebene und der Offset.

CV2.DrawContours (Frame1, Kontur, -1, (0, 0, 255), 2)

Endlich zeigen wir das Bild mit dem CV2.IMshow () Methode.

CV2.IMshow ("Bild", Frame1)

Jetzt setzen wir den Anfangsrahmen 2 als erster Frame und lesen das Video für einen neuen Frame, den wir in den Parameter Frame2 -Parameter einfügen.

Frame1 = Frame2
ret, Frame2 = Video.lesen()

Wenn die Taste „Q“ gedrückt wird, brechen Sie aus der Schleife aus:

Wenn CV2.WaitKey (40) == ord ('q'):
brechen
Video.freigeben()

Der Code als Ganzes für die Bewegungserkennung würde ungefähr so ​​aussehen:

Numph als NP importieren
CV2 importieren
Video = CV2.Videokapiture ("Vtest.avi ")
ret, Frame1 = Video.lesen()
ret, Frame2 = Video.lesen()
während Video.ist geöffnet():
Differenz = CV2.Absdiff (Frame1, Frame2)
grau = cv2.CVTColor (Differenz, CV2.Color_bgr2gray)
Blur = CV2.Gaußsianblur (Grau, (5,5), 0)
_, Schwelle = CV2.Schwelle (Blur, 20, 255, CV2.Thresh_Binary)
erweitern = cv2.erweitern (Schwellenwert, keine, Iterationen = 3)
Kontur, _ = CV2.FindContours (Dilat, CV2.Retr_tree, CV2.Chain_approx_simple)
CV2.DrawContours (Frame1, Kontur, -1, (0, 0, 255), 2)
CV2.IMshow ("Bild", Frame1)
Frame1 = Frame2
ret, Frame2 = Video.lesen()
Wenn CV2.WaitKey (40) == ord ('q'):
brechen
Video.freigeben()

Es ist einfach so einfach! Ein paar Codezeilen, und wir können unsere eigenen Programme zur Erkennung von Gesicht und Bewegung erstellen. Ein paar zusätzliche Zeilen, und wir können sie sogar zum Sprechen bringen (sagen wir mit PTTSX3) und unsere eigenen Sicherheitskameras erstellen!

Glückliche Codierung!