Hi,
I want to be able to control LED lights to change color by averaging the color from a webcam. I found this tutorial on ambient lighting which changes the color based on the average of the computer screen: http://siliconrepublic.blogspot.com/2011/02/arduino-based-pc-ambient-lighting.html
Right now it works pretty well and I am just opening QuickTime and full screening my webcam, which basically does the trick... but I wanted to know if it would be smoother if the code just took the information directly from the webcam opposed to the screen displaying the webcam?... does that make sense?
Also in my experience the color of the LEDS is usually red when the screen is mostly black....
Below is the code for arduino and processing that I got from the link I posted above.
Arduino:
I want to be able to control LED lights to change color by averaging the color from a webcam. I found this tutorial on ambient lighting which changes the color based on the average of the computer screen: http://siliconrepublic.blogspot.com/2011/02/arduino-based-pc-ambient-lighting.html
Right now it works pretty well and I am just opening QuickTime and full screening my webcam, which basically does the trick... but I wanted to know if it would be smoother if the code just took the information directly from the webcam opposed to the screen displaying the webcam?... does that make sense?
Also in my experience the color of the LEDS is usually red when the screen is mostly black....
Below is the code for arduino and processing that I got from the link I posted above.
Arduino:
//Developed by Rajarshi Roy
int red, green, blue; //red, green and blue values
int RedPin = 10; //Red: PWM pin 10
int GreenPin = 11; //Green: PWM pin 11
int BluePin = 9; //Blue: PWM pin 9
void setup()
{
Serial.begin(9600);
//initial values (no significance)
int red = 255;
int blue = 255;
int green = 255;
}
void loop()
{
//protocol expects data in format of 4 bytes
//(xff) as a marker to ensure proper synchronization always
//followed by red, green, blue bytes
if (Serial.available()>=4) {
if(Serial.read() == 0xff){
red = Serial.read();
green= Serial.read();
blue = Serial.read();
}
}
//finally control led brightness through pulse-width modulation
analogWrite (RedPin, red);
analogWrite (GreenPin, green);
analogWrite (BluePin, blue);
delay(10); //just to be safe
}
Processing:
-
//Developed by Rajarshi Roy
import java.awt.Robot; //java library that lets us take screenshots
import java.awt.AWTException;
import java.awt.event.InputEvent;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;
import java.awt.Dimension;
import processing.serial.*; //library for serial communication
Serial port; //creates object "port" of serial class
Robot robby; //creates object "robby" of robot class
void setup()
{
port = new Serial(this, Serial.list()[0],9600); //set baud rate
size(100, 100); //window size (doesn't matter)
try //standard Robot class error check
{
robby = new Robot();
}
catch (AWTException e)
{
println("Robot class not supported by your system!");
exit();
}
}
void draw()
{
int pixel; //ARGB variable with 32 int bytes where
//sets of 8 bytes are: Alpha, Red, Green, Blue
float r=0;
float g=0;
float b=0;
//get screenshot into object "screenshot" of class BufferedImage
BufferedImage screenshot = robby.createScreenCapture(new Rectangle(new Dimension(1368,928)));
//1368*928 is the screen resolution
int i=0;
int j=0;
//1368*928
//I skip every alternate pixel making my program 4 times faster
for(i =0;i<1368; i=i+2){
for(j=0; j<928;j=j+2){
pixel = screenshot.getRGB(i,j); //the ARGB integer has the colors of pixel (i,j)
r = r+(int)(255&(pixel>>16)); //add up reds
g = g+(int)(255&(pixel>>8)); //add up greens
b = b+(int)(255&(pixel)); //add up blues
}
}
r=r/(684*464); //average red (remember that I skipped ever alternate pixel)
g=g/(684*464); //average green
b=b/(684*464); //average blue
port.write(0xff); //write marker (0xff) for synchronization
port.write((byte)(r)); //write red value
port.write((byte)(g)); //write green value
port.write((byte)(b)); //write blue value
delay(10); //delay for safety
background(r,g,b); //make window background average color
}
1