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.

07 Color detection mit Sound integriert

März 13, 2012

Dieses kleine Projekt entstand in einer Kollaboration mit Rafael schneider. Durch das Taggen einer Farbe kann wie bei meinem vorangegangenen Projekt gemalt werden. Zusätzlich wird jedoch das Mikrofon ausgelesen um die Grösse der Dots darzustellen. Random wird ein Grauwert diesen Punkten zugeordnet. Möchte man die Punkte wieder löschen, so reicht eine Handbewegung über die Kamera und die Punkte werden gelöscht.

import processing.video.*; // importiert video library
import ddf.minim.*;
import ddf.minim.analysis.*;

Minim minim;
AudioInput in;
BeatDetect beat;

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

PVector Koordinate;

int W = 1024;
int H = 768;
int durchschnittB = 0;

boolean change = false;
boolean clicker = false;

color pColor;
color[] buffer;

Capture cam;

int res = 50;
int thresh = 20;

float newLevel = 0;
float oldLevel = 0;

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

buffer = new color[W * H];
PunkteArray = new ArrayList();  // Create an empty ArrayList
Farbe = new ArrayList();  // Create an empty ArrayList
grauWerte = new ArrayList<Float>();  // Create an empty ArrayList
groessenWerte = new ArrayList<Float>();  // 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

// load sound input
minim = new Minim(this);
minim.debugOn();
in = minim.getLineIn(Minim.STEREO, 16);

}

// Draw --------------------------------------------------
void draw() {

// calculate audio level -------------------
int totalInput = 0;
int avgInput = 0;

// calculate input average
for(int i = 0; i < in.bufferSize() - 1; i++)
{
totalInput += (abs(in.left.get(i)) *200);
}

avgInput = totalInput / in.bufferSize();

// use new average only if bigger than the old one
if (avgInput > oldLevel){
newLevel = avgInput;
} else if (avgInput <= oldLevel){
// if avgInput is not bigger, decrease the newLevel value
newLevel = (oldLevel - 0.5);
}

// Capture and display the video
if (video.available()) { // Video wird überprüft
video.read();
}
video.loadPixels(); // Pixels von Video werden analysiert
sampleAndPaint();
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));
grauWerte.add(random(10,255));
groessenWerte.add(newLevel);
}

if (change == true && clicker == false)
{
println("es hat geklappt");
PunkteArray = new ArrayList();  // Create an empty ArrayList
Farbe = new ArrayList();  // Create an empty ArrayList
grauWerte = new ArrayList<Float>();
}

punktemalen();
println(newLevel);
}

// Mouse Pressed -------------------------------------------
void mousePressed() {
// Save color where the mouse is clicked in trackColor variable
int loc = mouseX + mouseY*video.width;
trackColor = video.pixels[loc];
clicker = true;
change = false;
}

void sampleAndPaint()
{
fill(0, 30);
rect(0, 0, W, H);
for ( int i = 0; i < W; i+= res )
{
for ( int j = 0; j < H; j+=res )
{
int offset = i + j * W;
color c = video.pixels[offset];
color r = buffer[offset];

float cB = brightness(c);
float rB = brightness(r);

float delta = abs ( cB - rB );

if ( delta > thresh )
{
fill ( video.pixels[offset]);
noStroke();
if (change == true)
{
rect ( i, j, map(cB, 0, 255, 0, res*2), map(cB, 0, 255, 0, res*2) );
}
else
{
ellipse ( i, j, map(cB, 0, 255, 0, res*4), map(cB, 0, 255, 0, res*4) );
}
}
durchschnittB += delta;
//println(cB);
}
}
//println(durchschnittB );
if (durchschnittB > 50000 )
{
change = true;
println(change);
clicker = false;
PunkteArray = new ArrayList();
Farbe = new ArrayList();

//println(durchschnittB);
}
durchschnittB = 0;
}

void punktemalen()
{
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.
float grauWertAnzeigen = grauWerte.get(i); // (Integer wird dafür verwendet, damit man die Color aus dem ArrayList auslesen kann.

fill(farbeAnzeigen,grauWertAnzeigen);
}
float groessenWertAnzeigen = groessenWerte.get(i); // (Integer wird dafür verwendet, damit man die Color aus dem ArrayList auslesen kann.
noStroke();
ellipse(Vector.x, Vector.y, map(groessenWertAnzeigen,0,20,15,60), map(groessenWertAnzeigen,0,20,15,60));

}
}