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)); } }