Kamerabild-Verlauf im Raster abbilden in Processing

Hinzugefügt am von Jonas Loh
Auf Grundlage des vorherigen Beispiels stellt dieser Sketch das von der Kamera aufgenommene Bild nicht 1:1 dar, sondern zeichnet den gesamten 'Bildspeicher' in die Zeichenfläche. Um keinen Fehler zu verursuchen überprüft die if-Bedingung, mit der Abfrage if (buffer[i] != null) { ob bereits ein Bild vom Typ PImage im Array-Feld vorhanden ist. Ist das der Fall, wird anhand der Zählvariable i die Position des Bildes in der Matrix berechnet.

Der Sketch

import processing.video.*;

// Schnittstelle zur Kamera
Capture cam;

// Speicher für die Einzelbilder aus 
// der 'Vergangenheit'
PImage[] buffer;

// Anzahl der Einzelbilder pro 
// Sekunde für Sketch und Aufnahme 
int fps = 21;

// Zeitverzögerung in Sekunden
int lagSeconds = 2;

// Abspielposition und damit Schlüssel
// für das Einfügen/Auslesen aus dem Buffer
int index = 0;

// Status ob der Bildspeicher schon 
// einmalig komplett gefüllt wurde
boolean filled = false;

// Anzahl der Spalten im Sketchfenster
int cols = 6;

void setup () {
  size (318, 278);
  frameRate (fps);
  cam    = new Capture (this, 320, 240, 20);
  buffer = new PImage[lagSeconds * fps];
}

void draw () {   
  // Bildgröße für Raster ermitteln
  float imgWidth = width / cols;
  float aspect = imgWidth / cam.width;
  float imgHeight = cam.height * aspect;

  // Für jedes Feld im 'Bildspeicher'
  for (int i=0; i < buffer.length; i++) {
    // Wenn ein Bild existiert
    if (buffer[i] != null) {
      // Berechne die Position im Raster
      float x = (i % cols) * imgWidth;
      float y = floor (i / cols) * imgHeight;

      image (buffer[i], x, y, imgWidth, imgHeight);
    }
  }
}

void captureEvent (Capture theCam) {
  // Lies das aktuelle Kamerabild aus
  theCam.read ();
  // Speicher eine Kopie im Buffer an 
  // der Position des Bildes welches 
  // gerade ausgelesen wurde
  buffer[index] = theCam.get ();
  // Erhöhe die Position für das Auslesen
  // um eins, auf das älteste Bild im Buffer
  index++;

  // Wenn am Ende des Buffers angekommen,
  // springe wieder an den Anfang.
  if (index >= buffer.length) {
    index = 0;
    if (!filled) {
      filled = true;
    }
  }
}