Jeffrey Cross
Jeffrey Cross

Codebox: Verliere deinen Kopf mit OpenCV

OpenCV ist eine "Bibliothek von Programmierfunktionen für Echtzeit-Computer Vision". Ein Open-Source-Projekt, das von Willow Garage unterstützt wird. Die Bibliothek enthält über 500 Algorithmen für die Bildbearbeitung, Objekterkennung, Feature-Extraktion und eine Vielzahl anderer Tools, die Sie verwenden können Programme schreiben, die "sehen" können.

Die OPENCV Processing and Java Library, ein Projekt, das von Stéphane Cousot und Douglas Edric Stanley an der Supérieure d'Art-en-Provence betrieben wird, bietet einen Wrapper, mit dem Sie eine Teilmenge von OpenCV verwenden können in Bearbeitung. Zu Ehren von Halloween zeigt Ihnen diese Codebox, wie Sie mithilfe von OpenCV die Köpfe von Personen in Echtzeit aus einem Video-Feed entfernen können. Zum Beispiel:

Zukünftige Beiträge werden weniger grausame Anwendungen für diese großartige Bibliothek enthalten.

Installation von OpenCV Processing und Java Library

Der erste Schritt bei der Verwendung der Bibliothek ist das Herunterladen und Installieren von http://ubaa.net/shared/processing/opencv/. Die Dokumentation der Site ist großartig - folgen Sie einfach den Schritten, die auf der Hauptseite unter "Installationsanweisungen" aufgeführt sind. Wenn Sie die Schritte ausgeführt haben, starten Sie die Verarbeitung, und probieren Sie dann den Code aus dem Beispiel detect () aus, der ein rotes Rechteck um alle in der Webcam erkannten Gesichter (Frontansicht) setzt. Sie sollten so etwas sehen:

Hinweis für Windows-Benutzer: Möglicherweise müssen Sie QuickTime und WinVDIG installieren, um die Webcam in Processing verwenden zu können.

Einrichten der Skizze

Sobald Sie die Grundlagen haben erkennen () Als Beispiel können Sie die folgende Skizze verwenden.Wie bei anderen Posts dieser Serie können Sie entweder den gesamten Text im Feld darunter markieren und Strg + C drücken oder direkt zum Makezine-Code-Repository gehen und headless_cam.pde kopieren.

Wenn Sie das Programm starten, sollte eine Meldung angezeigt werden, die besagt, dass Sie aus der Szene aussteigen und eine beliebige Taste drücken müssen. Wenn die Küste frei ist, drücken Sie eine beliebige Taste und gehen Sie zurück in das Bild. Sie (und alle anderen) sollten dank OpenCV ohne Kopf sein. Wenn Sie sich bewegen, werden Sie bemerken, dass Ihr Kopf ein- und ausblinkt. Dies geschieht, wenn der Erkennungsalgorithmus von OpenCV durch etwas gestört wird. Wenn Sie zum Beispiel Ihre Hand vor Ihr Gesicht halten, wird der OpenCV-Erkennungsalgorithmus "gebrochen".

Diskussion

Wie funktioniert das Ding? Eigentlich ist es ziemlich einfach - die Skizze sucht nur nach Gesichtern mit OpenCV erkennen () Ersetzen Sie dann die erkannten Gesichter durch dieselben (aber etwas größeren) Pixel aus dem Hintergrundbild, das am Anfang der Skizze gespeichert wurde. Dadurch verschwindet das Gesicht meistens. Geringe Unterschiede in der Beleuchtung verursachen kleine Änderungen zwischen den neuen und alten Bildern, wodurch das ersetzte Gesicht ein wenig kantig erscheint. Theoretisch sollten Sie in der Lage sein, einige dieser Funktionen mit anderen OpenCV-Funktionen auszugleichen, dies gilt jedoch für zukünftige Projekte.

Der erste Schritt in der Skizze besteht darin, ein Bild der leeren Hintergrundszene zu speichern. Dies geschieht durch die Kopieren() Befehl in der Taste gedrückt() Methode:

bg.copy (Nocken, 0,0, Breite, Höhe, 0,0, Breite, Höhe);

Der Befehl erfordert zwei Bilder: a Ziel Bild, wo die Pixel kopiert werden zu, und ein Quelle Bild, wo die Pixel kopiert werden von. Um es zu benutzen, rufen Sie das an Kopieren() Methode auf dem Zielbild (in diesem Fall die Variable) bg) und geben Sie die neun (!) erforderlichen Argumente an.

  • Das Quelle Bild, von dem wir eine Kopie machen möchten. In diesem Fall verwenden wir die Variable Nocken, das den aktuellen Frame der Webcam enthält.
  • Der Bereich im Quellbild, der kopiert werden soll. Dieser Bereich wird durch die nächsten vier Argumente beschrieben: die X- und Y-Koordinaten der oberen linken Ecke der Region sowie die Breite und Höhe der Region.
  • Der Bereich im Zielbild, in den die kopierten Pixel verschoben werden. Diese ähneln den vorherigen vier Argumenten und bestehen aus den X- und Y-Koordinaten sowie der Breite und Höhe des Bereichs. Wenn sich die Abmessungen zwischen Quell- und Zielbereich unterscheiden, wird das Bild bei der Verarbeitung automatisch skaliert.

Nachdem dieser Befehl ausgeführt wurde, wird eine Kopie der Hintergrundszene in der Variablen gespeichert bg. Im nächsten Schritt suchen Sie mit OpenCV nach Gesichtern. Wie zuvor beschrieben, erfolgt dies mit der erkennen () Methode, die ein Array von Rechtecken zurückgibt. Ein Rechteck ist eine Klasse, die in Java enthalten ist, der Basissprache, von der die Verarbeitung abgeleitet ist. (Eine der coolen Eigenschaften von Processing ist, dass er jeden Befehl verwenden kann, der in Java verwendet werden kann, wodurch er tatsächlich eine sehr mächtige Sprache wird.) Ein Rechteck hat vier Schlüsselfelder, die uns betreffen: die X- und Y-Koordinate der oberen linke Ecke und eine Breite und Höhe. (Klingt bekannt?)

Wenn wir nur das Gesicht ersetzen wollten, können wir einfach das verwenden Kopieren() Befehl zum Kopieren über die entsprechenden Regionen. (Beachten Sie das loadPixels () und updatePixels () Methode ist immer dann erforderlich, wenn wir auf die Pixel in einem Bild zugreifen oder diese aktualisieren möchten.) Hier der Code:

fg.Kopie (Nocken, 0,0, Breite, Höhe, 0,0, Breite, Höhe); // Das Kamerabild nach fg kopieren opencv.copy (cam); // Das Bild in den Puffer von openCV kopieren Rectangle [] faces = opencv.detect (); // etwas erkennen, für das ein FRONTALFACe zusammengesetzt wird (int i = 0; i

Hier ist die Ausgabe:

Wie Sie sehen, ist das Entfernen nur des Gesichts nicht ganz richtig, da ein großer Teil des Kopfes sichtbar bleibt. Daher benötigen wir auch eine Möglichkeit, die Box zu vergrößern. Das ist der Job vergrößernFaceBox (), die etwas Trigonometrie verwendet, vergrößert die Box um einen bestimmten Prozentsatz und verschiebt sie entlang ihrer Diagonale. Das folgende Diagramm zeigt, was passiert:

Der Trigger kommt zum Tragen, wenn die korrekten Verschiebungen berechnet werden, durch die das Rechteck die Diagonale nach oben verschoben wird. Die Schlüsselfunktion ist atan2 (), der den Winkel zwischen zwei Punkten relativ zur x-Achse berechnet. (Dieser Winkel wird oft genannt Theta von alten Mathematikern). Sobald du hast Theta, du kannst den ... benutzen cos () und Sünde() Funktionen zur Berechnung der x- und y-Verschiebungen dx und dy. Hier ist der Code:

Rectangle EnlargeFaceBox (float incPct, int x, int y, int w, int h) {float r = dist (0,0, w, h) / 2; // Berechnet den Radius des mittleren diagonalen Schwimmers theta = atan2 (h, w); // Berechnet den Winkel des diagonalen Schwimmers dx = r * incPct * cos (Theta); // Finds float dy = r * incPct * sin (Theta); neues Rechteck ((int) (x - dx), (int) (y - dy), (int) (w + 2 * dx), (int) (h + 2 * dy)) zurückgeben; }

Schließlich müssen wir, da wir das Feld vergrößern, sicherstellen, dass es in den sichtbaren Bereichen des Bildschirms bleibt, genau wie in der SWAT-Datei (Arraylist) des Targets-Projekts. Dies geschieht hier:

faceBox = enlargeFaceBox (0.75, Gesichter [i] .x, Gesichter [i] .y, Gesichter [i] .width, Gesichter [i] .height); if (faceBox.x <0) {faceBox.x = 0; } if (faceBox.x + faceBox.width> width) {faceBox.width = width - faceBox.x; } if (faceBox.y <0) {faceBox.y = 0; } if (faceBox.y + faceBox.height> height) {faceBox.height = height - faceBox.y; } ...

Und das ist es. Hoffen Sie, dass Sie an Halloween eine gruselige Verwendung finden können.

PS: Alle Details zum Umgang mit Bildern finden Sie in Daniel Shiffmans hervorragendem Tutorial zu Images und Pixels auf der Processing.org-Site. (Das Kapitel ist ein Auszug aus seinem wunderbaren Buch "Learning Processing: Ein Anfängerleitfaden für das Programmieren von Bildern, Animationen und Interaktionen", den ich Ihnen dringend empfehlen sollte, wenn Sie wirklich die Verarbeitung beherrschen möchten.)

In der Schuppenhalle:


Erste Schritte mit Processing Lernen Sie die Computerprogrammierung auf einfache Weise mit Processing, einer einfachen Sprache, mit der Sie Code zum Erstellen von Zeichnungen, Animationen und interaktiven Grafiken verwenden können. Programmierkurse beginnen normalerweise mit der Theorie, aber in diesem Buch können Sie direkt in kreative und unterhaltsame Projekte einsteigen. Es ist ideal für alle, die grundlegende Programmierung erlernen möchten, und ist eine einfache Einführung in die Grafik für Personen mit Programmierkenntnissen.

Aktie

Leave A Comment