März 13, 2012
![](../../../../files/2012/03/Bildschirmfoto-2012-03-13-um-19.13.48-300x225.png)
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)); } }