Computer Vision


Computer Vision

Durch schnellere Hardware, bessere Modelle und Konzepten aus dem Bereich maschinelles Lernen wurde Computer Vision (kurz CV, die Analyse von Bild- und Videomaterial durch Computer) in den letzten Jahren ein sehr populäres Forschungs- und Entwicklungsfeld. Insbesondere selbststeuernde Fahrzeuge , die kontinuierlich ihre Umgebung visuell analysieren, erlangten starke Aufmerksamkeit.

Yu Xiang and Silvio Savarese. Computational Vision and Geometry Lab, Stanfort University, CA.

Brightness Tracking

Zur Analyse von Bildmaterial durch Code stehen unterschiedliche Methoden zur Verfügung. Sie basieren grundsätzlich darauf, dass die Farb- und Helligkeitswerte der Pixel in Echtzeit ausgelesen werden und diese Daten verwendet werden, um Muster zu erkennen. Eine einfache Methode ist im folgenden Beispiel dargestellt. Im Algorithmus werden die Helligkeitswerte aller Pixel ausgelesen und das hellste Pixel im Bild in einer Variable abgelegt. Obwohl die Methode sehr einfach gehalten ist, kann sie bereits genutzt werden, um helle Objekte wie einen Light-Pointer oder dunkle wie Gläser in einem Kamera-Signal zu erkennen:

Interactive Bar Tables, Golan Levin, 2004

Beispiel 2-13

import processing.video.*;          // Die Video-Library importieren

Capture video;                          // Das Capture-Objekt deklarieren

void setup() {
  size(1280, 720);
  video = new Capture(this, 1280, 720);     // Apple Facetime-Cam HD Auflösung
  video.start();
}

void draw() {
  image(video, 0, 0);                   // stelle des Video-Bild im Ausgabefenster dar
   int maxbrightX = 0;                   // X-coordinate of the brightest video pixel
   int maxbrightY = 0;                   // Y-coordinate of the brightest video pixel
   float maxbrightValue = 0; // Brightness of the brightest video pixel
    video.loadPixels();
    int index = 0;
    for (int y = 0; y < video.height; y++) {                // nach dem hellsten Pixel suchen
      for (int x = 0; x < video.width; x++) {               // siehe auch Golan Levin
        int pixelValue = video.pixels[index];
        float pixelBrightness = brightness(pixelValue);
        if (pixelBrightness > maxbrightValue) {            // Testen ob das aktuelle Pixel heller ist als alle vorigen
          maxbrightValue = pixelBrightness;
          maxbrightX = x;
          maxbrightY = y;
        }
        index++;
      }
    }
    fill(0, 30);
    ellipse(maxbrightX, maxbrightY, 50, 50);
}

void captureEvent(Capture video) {
  video.read();                         // das verfügbare Bild der Kamera auslesen
}

In einem Setup für eine Installation könnte nun der Raum eher dunkel gehalten werden und die Bewegung einer Lichtquelle durch das Tracken von hellen Pixeln verfolgt werden. Exemplarisch könnte obiger Code mit dem Zeichen-Beispiel (1-3) aus Kapitel 1-4 kombiniert werden um mit einem "Leuchtstift" einen Pinsel auf den Bildschirm zu steuern. Die folgenden Zeilen müssen dafür auskommentiert bzw. hinzugefügt werden:

//image(video, 0, 0);
…
//fill(0, 30);
    //ellipse(maxbrightX, maxbrightY, 50, 50);
    //paintIt(maxbrightX, maxbrightY);
    float heavyness = 30-((abs(maxbrightX-xOld))+(abs(maxbrightY-yOld)));
    heavyness = constrain(heavyness, 6, 30);
    strokeWeight(heavyness);
    stroke(maxbrightX,100,maxbrightY, 30-heavyness);
    line(xOld, yOld, maxbrightX, maxbrightY);   // 1. Variante
    xOld = maxbrightX;
    yOld = maxbrightY;

Color Tracking

Color Tracking stellt eine weitere Möglichkeit dar, die Position eines Objekt in einem Video-Stream zu verfolgen. Geeignet ist die Technik für Objekte, die sich aufgrund ihrer Farbigkeit stark von ihrer Umgebung abheben. Komplexere Aufgaben der Computer Vision erfordern komplexere Algorithmen zu Analyse und Vergleich von Bilddaten. Inzwischen gibt es einige Libraries für Processing, die entsprechende Funktionen zur Verfügung stellen. Populär ist im Allgemeinen OpenCV, das auch in einer Version für Processing vorliegt.

Um die Library zu nutzen sollte wiederum zunächst die OpenCV-Library für Processing über den Library-Managerinstalliert werden. Eine Beschreibung von OpenCV findet sich hier.

Bevor die Funktionen von OpenCV genutzt werden können müssen wie immer die benötigten Libraries durch den Befehl import importiert werden. Die Library java.awt.* ist eine Java-Library, sie wird für das Zwischenspeichern der Rechtecke, die die Gesichtserkennung zurückliefert, benötigt.

Da Processing auf der Programmiersprache Java basiert ist es allgemein möglich, auf Java-Libraries zurückzugreifen.

Ausserdem wird die Processing-Library OpenCV selbst importiert:

import gab.opencv.*;
import processing.video.*;
import java.awt.*;

Dann muss ein Objekt jeweils für Video und für OpenCV erstellt werden:

Capture video;
OpenCV opencv;

Beispiel 2-14

siehe Beispiel `HSVColorTracking`der OpenCV-Library

Gesichtserkennung

Beispiel

connected colors (Nobumichi Asai, 2016)

Eyecode (Golan Levin, 2007)

Google Earth Faces (2013) ›An algorithmic robot hovering over the world to spot portraits hidden in the topography on planet earth. The custom application works autonomously to process vast amounts of satellite images through Google Maps by using a face detection algorithm. This endless cycle produces interesting results for reflection on the natural world.‹

Die wiederum von OpenCV bereitgestellte Funktion detect() wird verwendet, um ein Objekt in Echtzeit im dem Video zu erkennen. Die Kriterien, wie ein Objekt aussehen soll, um vom Sketch wahrgenommen zu werden, müssen zuerst festgelegt werden. Dies erfolgt mit der Funktion cascade(), die eine Art Beschreibung des Objekts in den Speicher lädt und den Computer das aktuelle Bild mit dieser "Vorlage" kontinuierlich vergleichen lässt. Diese Beschreibungen kann man selbst erstellen, es existieren praktischerweise aber bereits einige für die Erkennung von Gesichtern oder Körpern. Weitere Cascade Definitionen hier

opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE); 

Die Funktion detect() liefert dann rechteckige Bereiche im Bild zurück, in denen sich ein Objekt – in unserem Fall ein Gesicht - befindet, das den Kriterien entspricht.

Rectangle[] faces = opencv.detect();

Im folgenden Beispiel werden Gesichter im Webcam-Video getrackt. Wenn die Taste s gedrückt wird, werden alle im Bild erkannten Gesichter als .jpg abgespeichert.

Beispiel 2-16

import gab.opencv.*;
import processing.video.*;
import java.awt.*;

Capture video;
OpenCV opencv;
Rectangle[] faces;

void setup() {
  size(1280, 760);
  fill(255,50);
  stroke(255);
  strokeWeight(3);
  video = new Capture(this, 1280, 720);
  opencv = new OpenCV(this, 1280, 720);
  opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);  
  video.start();
}

void draw() {
  opencv.loadImage(video);
  image(video, 0, 0 );
  faces = opencv.detect();

  for (int i = 0; i < faces.length; i++) {
    //println(faces[i].x + "," + faces[i].y);
    rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
  }
}

void captureEvent(Capture c) {
  c.read();
}

void keyPressed(){
  if (key == 's'){ 
     for(int i = 0; i < faces.length; i++){
       int w = int(faces[i].width);
       int h = int(faces[i].height);
       int rectX = faces[i].x;
       int rectY = faces[i].y;
       PImage face = createImage(w,h,RGB);
       for(int x = 0; x < faces[i].width; x++){
         for(int y = 0; y < faces[i].height; y++){
            face.set(x, y, get(x+rectX,y+rectY));
         }
       }
       face.save("test.jpg");
     }
  }
}

Objekt-Tracking mit BoofCV

Die Library BoofCV bietet Funktionen zum Objekt-Tracking.

Beispiel-Code Objekt-Tracking