Very, very interesting!
http://www.behance.net/gallery/Everyone-Ever-in-the-World/591921
Speed of Light celebrates the tenth anniversary of broadband in the UK. Stripped back to its essentials, optical fibre is a thin strand of glass, with nothing more than a flickering beam of light traveling along it. United Visual Artists have used this beam as the starting point for the work.
ARTICLE HERE
The concept
The piece is meant to alter the user’s experience of karaoke based on his or her own chemistry. The concept is to have a breathalyzer built into a microphone that drunk folks are unknowingly using for karaoke. The breathalyzer takes the alcohol blood levels and based on that, warps the video component of the karaoke experience. The words on the bottom of the screen will begin to get blurry in relation to the alcohol level.
The process
Initially, we followed a how-to on instructables.com on how to build a breathalyzer with an arduino but after much difficulty we chose to tweak it and build it with fewer parts. We found the process to be a lot more difficult than we had predicted at first. Many of the parts took time to track down, such as the JST connector.
What went well
We are happy with the result and look forward to creating video content to affect with the data from the breathalyzer.
Contribution
My contribution to this project was the project assembly. I joined this group late, so it was hard to contribute to the overall concept, but I was able to give a fresh set of eyes to the project, and help troubleshoot some of the issues we were having. Originally our plan was to have a microphone detect the alcohol level, and have it represent something different on the screen. We weren’t able to come up with this, however, we were able to illustrate our results in the form of a visual graph. This worked out quite nicely as it gave the viewers a real idea of what their alcohol levels looked like. It was interesting to see people who went out drinking the night previous to when we presented, as their levels were distinctly higher than those who did not go out.
I also contributed to this project through documenting our progress through photographs, as shown below.
I bought one of these the other day for my telepresence project. It’s the LOGOMATIC V2 by Sparkfun (http://www.sparkfun.com/commerce/product_info.php?products_id=8627).
$78 later….
I really hope this project works out!!
PFont font;import processing.video.*;
Capture video;
void setup() { size(800, 600); video = new Capture(this, width, height, 12); font = loadFont (“Helvetica-25.vlw”); noStroke(); background(0, 0, 0); smooth();}
void draw() { if (video.available()) { video.read(); image(video, 0, 0, width, height); int colorX = 255; int colorY = 255; float closestColor = 10000; video.loadPixels(); int index = 0; for (int y = 0; y < video.height; y++) { for (int x = 0; x < video.width; x++) { color pixelValue = video.pixels[index]; float colorProximity = abs(red(pixelValue)-255)+abs(green(pixelValue)-0)+abs(blue(pixelValue)-0); if (colorProximity < closestColor) { closestColor = colorProximity; closestColor=closestColor-10; colorY = y; colorX = x; } index++; } } textFont(font, 25); text(“MONEY”, colorX, colorY+20); } }
Example #1
import processing.video.*;PImage dollar;Capture video;color trackColor;
void setup() { dollar = loadImage(“dollar.jpg”); size(640,280); video = new Capture(this,width,height,15); smooth();}
void draw(){ if (video.available()) { video.read(); } video.loadPixels(); image(video,0,0); float worldRecord = 500; int closestX = 0; int closestY = 0; for (int x = 0; x < video.width; x ++ ) { for (int y = 0; y < video.height; y ++ ) { int loc = x + y*video.width; color currentColor = video.pixels[loc]; float r1 = red(currentColor); float g1 = green(currentColor); float b1 = blue(currentColor); float r2 = red(trackColor); float g2 = green(trackColor); float b2 = blue(trackColor); float d = dist(r1,g1,b1,r2,g2,b2); if (d < worldRecord) { worldRecord = d; closestX = x; closestY = y; } } }
if (worldRecord < 10) { fill(255, 0, 0); noStroke(); ellipse(closestX,closestY,10,10); noStroke(); }}
void mousePressed() { // Save color where the mouse is clicked in trackColor variable int loc = mouseX + mouseY*video.width; trackColor = video.pixels[loc];}
Example #2
// Learning Processing
// Daniel Shiffman
// http://www.learningprocessing.com
// Example 16-11: Simple color tracking
import processing.video.*;
// Variable for capture device
Capture video;
// A variable for the color we are searching for.
color trackColor;
void setup() {
size(640,280);
video = new Capture(this,width,height,15);
// Start off tracking for red
trackColor = color(255,0,0);
smooth();
}
void draw() {
// Capture and display the video
if (video.available()) {
video.read();
}
video.loadPixels();
image(video,0,0);
// 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;
// XY coordinate of closest color
int closestX = 0;
int closestY = 0;
// Begin loop to walk through every pixel
for (int x = 0; x < video.width; x ++ ) {
for (int y = 0; y < video.height; y ++ ) {
int loc = x + y*video.width;
// What is current color
color currentColor = video.pixels[loc];
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;
}
}
}
// We only consider the color found if its color distance is less than 10.
// This threshold of 10 is arbitrary and you can adjust this number depending on how accurate you require the tracking to be.
if (worldRecord < 10) {
// Draw a circle at the tracked pixel
fill(255, 0, 0);
noStroke();
ellipse(closestX,closestY,10,10);
ellipse(closestX+1,closestY+1,7,7);
ellipse(closestX-1,closestY-1,6,6);
ellipse(closestX-6,closestY+6,7,7);
ellipse(closestX-10,closestY-10,7,7);
ellipse(closestX-10,closestY+10,7,7);
ellipse(closestX+20,closestY+24,8,8);
ellipse(closestX-5,closestY+5,14,14);
ellipse(closestX+30,closestY+14,10,10);
ellipse(closestX-5,closestY+5,7,7);
ellipse(closestX-13,closestY+13,4,4);
ellipse(closestX-26,closestY-26,7,7);
ellipse(closestX-28,closestY+28,15,15);
ellipse(closestX+30,closestY+30,8,8);
}
}
void mousePressed() {
// Save color where the mouse is clicked in trackColor variable
int loc = mouseX + mouseY*video.width;
trackColor = video.pixels[loc];
}