Oder Text markieren und Enter drücken…

Brightness- und Colortracking

Brightness-Tracking

 

 

 

Das Brightness-Tracking ist eine einfache Möglichkeit, mit welcher einzelne, helle Objekte verfolgt werden können (z.B. eine Lichtquelle wie eine Taschenlampe oder eine Leuchtdiode).
Anhand eines Algorithmus wird der Farbwert jedes Pixels aus einem Pixel-Array des neuen Bildes gemessen und mit dem bisher hellsten Punkt verglichen. Sobald ein Pixel heller als der bisher hellste ist, wird er als der neue hellste Punkt gespeichert. Nach dem Auslesen und Auswerten jedes Bildpunktes kann somit erfasst werden, welches der insgesamt hellste Pixel ist (sobald der maximale Helligkeitswert einmal ereicht ist werden keine weiteren Punkte gespeichert). Diese Prozedur wird mit in jedem neuen Frame wiederholt,  sodass eine Lichtquelle verfolgt werden kann.

 

 pixelarray_01

Videobilder werden als Farbwert pixelweise als Array gespeichert. Über den Index i des Array img.pixels[i] kann auf jeden Pixel des Videobildes zugegriffen werden.

 

pixelarray_02

Es kann durch den Index bspw. nicht direkt auf das Pixel in der 2. Zeile, 2. Spalte zugegriffen werden (hier: 5). Um auf das zweidimensionale Bild in konventioneller Weise (kartesische Koordinaten) zugreifen zu können, kann man folgende Formel verwenden: index = y * width + x

 

Processing Source-Code:

 

// BRIGHTNESS TRACKING
// Tracking Technologien Sommersemester 2009

// Ulrich Lang, Thomas Techert, Fabian Gronbach

// An der hellsten Stelle im Kamerabild wird ein roter Punkt gezeichnet.
 
import processing.video.*;
float brightestPixel = 0;
Capture video;
int brightestX = 0;
int brightestY = 0;

void setup() {
  size(640, 480);
  video = new Capture(this, width, height, 24);
  fill(255,0,0);
  smooth();
}

void draw() {
  if (video.available()) {
    video.read();
    video.loadPixels();
    image(video, 0, 0, width, height);
    loadPixels();
   
    for (int i = 0; i < width*height; i++) {
      float pixelBrightness = brightness(video.pixels[i]);
      if (pixelBrightness > brightestPixel) {

        brightestPixel = pixelBrightness;
        brightestY = i / width;
        brightestX =  i - ( brightestY * width);

      }
    }
    brightestPixel = 0;
    ellipse(brightestX, brightestY, 50, 50);

  }
}
 
 

 

An Stelle des hellsten Pixels kann mit Hilfe dieser Methode natürlich auch eine bestimmte Farbe definiert werden, welche verfolgt wird. Durch eine leichte Abwandlung des Algorithmus ist es möglich bestimmte Farbereiche tracken zu können – womit etwa kleine, farbige Objekte verfolgt werden können. (vgl. Color-Tracking).

 

Color-Tracking

Colortrack

 

 

Processing Source-Code:

 

// COLOR TRACKING
// Tracking Technologien Sommersemester 2009

// Ulrich Lang, Thomas Techert, Fabian Gronbach

// Press Mouse to select color to track...
// SCRIPT SUCHT IMMER DEN LETZTEN PIXEL IM ARRAY; DER DER FARBE +- SCHWELLENWERT ENTSPRICHT
 
import processing.video.*;
float nearestPixel = 0;
Capture video;
int trackedX = 0;
int trackedY = 0;

// Nach folgender Farbe suchen:
float track_for_r = 0;
float track_for_g = 0;
float track_for_b = 0;
// +-
int threshold = 10;

void setup() {

  size(640, 480);
  video = new Capture(this, width, height, 24);
  fill(255,0,0);
  smooth();
}

void draw() {
  // Farbe aufnehmen
  if (mousePressed == true) {
    rect(mouseX-10, mouseY-10, 20, 20);
    track_for_r= red(video.pixels[(mouseY*width)+mouseX]);
    track_for_g= green(video.pixels[(mouseY*width)+mouseX]);
    track_for_b= blue(video.pixels[(mouseY*width)+mouseX]);
    fill(color(video.pixels[(mouseY*width)+mouseX]));
  }
 

  if (video.available()) {
    video.read();
    video.loadPixels();
    image(video, 0, 0, width, height);
    loadPixels();

    for (int i = 0; i < width*height; i+=5) {
      float valueRed = red(video.pixels[i]);
      float valueGreen = green(video.pixels[i]);
      float valueBlue = blue(video.pixels[i]);

      if (valueRed >= track_for_r - threshold && valueRed <= track_for_r + threshold && valueGreen >= track_for_g - threshold && valueGreen <= track_for_g + threshold && valueBlue >= track_for_b - threshold && valueBlue <= track_for_b + threshold) {

        trackedY = i / width;
        trackedX =  i - ( trackedY * width);

      }
    }

    ellipse(trackedX, trackedY, 50, 50);

  }
}