Willkommen auf unserem Seminar-Blog

Immer auf dem aktuellen Stand bleiben

Dieser Seminar-Blog befindet sich noch im Aufbau und wird in den kommenden Tagen entsprechend verfeinert.

Member Login

Lost your password?

Registration is closed

Sorry, you are not allowed to register by yourself on this site!

You must either be invited by one of our team member or request an invitation by email at viad.info {at} zhdk {dot} ch.

06 Color Tracking

Februar 27, 2012

Wir elernten den Umgang mit dem Color-Tracking. Anschliessend erstellte ich ein kleines Malprogramm mit welchem es möglich ist, einen Gegenstand oder Farbklecks zu taggen (per Mausklick) und anschliessend durch eine Bewegung zu malen. Die gezeichneten Rechtecke werden in der Farbe des getaggten Gegenstandes dargestellt. Code:

import processing.video.*; // importiert video library

// Object variables -------------------------------------
Capture video; //initalisiert video
PShape s; // erstellt einen Shape
color trackColor; // erstellt eine Farbvariable
ArrayList PunkteArray;
ArrayList Farbe;

PVector Koordinate;

// Setup ------------------------------------------------
void setup() {

PunkteArray = new ArrayList();  // Create an empty ArrayList
Farbe = new ArrayList();  // Create an empty ArrayList

size(1024,768); // erstellt das Fenster

video = new Capture(this,1024,768,"IIDC FireWire Video",15); // zieht die Webcambilder
// Start off tracking for red
//trackColor = color(255,0,0); // gibt eine Track Farbe an 255,0,0

// load Shape
s = loadShape("YaoMing-meme.svg"); // lädt die Grafik welche angezeigt werden soll
shapeMode(CENTER); // setzt den Grafikmittelpunkt in die Mitte
trackColor = color(255,0,0);
smooth(); // kantenglättung
}

// Draw --------------------------------------------------
void draw() {
// Capture and display the video
if (video.available()) { // Video wird überprüft
video.read();
}
video.loadPixels(); // Pixels von Video werden analysiert
image(video,0,0); // Video wird angezeigt

// Before we begin searching, the "world record" for closest color is set to a high number that is easy for the first pixel to beat.
float worldRecord = 500;  // Variable worldRecord wird generiert und mit dem Wert 500 versehen.

// XY coordinate of closest color
int closestX = 0; // Variable
int closestY = 0; // Variable

// Begin loop to walk through every pixel
for (int x = 0; x < video.width; x ++ ) { // Schlaufe x Werte
for (int y = 0; y < video.height; y ++ ) { // Schlaufe y Werte
int loc = x + y*video.width;  // Pixelposition werd anze
// What is current color
color currentColor = video.pixels[loc]; // Farbe des Pixels wird ausgelesen
float r1 = red(currentColor);
float g1 = green(currentColor);
float b1 = blue(currentColor);
float r2 = red(trackColor);
float g2 = green(trackColor);
float b2 = blue(trackColor);

// Using euclidean distance to compare colors
float d = dist(r1,g1,b1,r2,g2,b2); // We are using the dist( ) function to compare the current color with the color we are tracking.

// If current color is more similar to tracked color than
// closest color, save current location and current difference
if (d < worldRecord) {
worldRecord = d;
closestX = x;
closestY = y;

}
}
}

if (worldRecord < 30) {
// Draw a circle at the tracked pixel
fill(trackColor,100);
strokeWeight(1.0);
stroke(255);
Koordinate = new PVector(closestX, closestY);
PunkteArray.add(Koordinate);
Farbe.add(color(trackColor));

}

for(int i=0; i < PunkteArray.size(); i++)
{
PVector Vector = (PVector) PunkteArray.get(i);
float xPos = Vector.x;
float yPos = Vector.y;
for (int x = 0; x < Farbe.size(); x++)
{
color farbeAnzeigen = (color)(Integer)Farbe.get(i); // (Integer wird dafür verwendet, damit man die Color aus dem ArrayList auslesen kann.
fill(farbeAnzeigen);
}
rect(Vector.x,Vector.y,30,30);
}

//println(FarbArray);
}
/*
void FarbbereichAnalysieren(PImage img, int _x, int _y, int breite, int hoehe)
{

FarbArray = new ArrayList();

println(FarbArray);

int r = 0;
int g = 0;
int b = 0;

for (int i = _x; i < _x+breite; i++) {
for (int j = _y; j < _y+hoehe; j++) {
int FarbWert = int(color(img.get(i,j)));
FarbArray.add (FarbWert);
}
}
}
*/
// Mouse Pressed -------------------------------------------
void mousePressed() {
// Save color where the mouse is clicked in trackColor variable
int loc = mouseX + mouseY*video.width;
trackColor = video.pixels[loc];

//FarbbereichAnalysieren(video,mouseX,mouseY,30,30);
}