import processing.video.*; // MAC
import processing.serial.*;
import cc.arduino.*;
Arduino arduino;
Capture cam; // MAC
PImage imgref;
PImage imgout;
PImage imgmask;//para menos ruido en la imagen
color ca,cb,ct;
float ra,ga,ba;
float rb,gb,bb;
float rt,gt,bt;
int n = 3; //numero de subregiones de la img
float umbral;
float[] area = new float [n]; //el array depende el la variable n
float[] cmx = new float [n];
float[] cmy = new float [n];
void setup() {
size(800,600);
cam = new Capture(this, 320, 240); // MAC
imgref = createImage(cam.width,cam.height,RGB);
imgout = createImage(cam.width,cam.height,RGB);
imgmask = createImage(cam.width,cam.height,RGB);
arduino = new Arduino (this, Arduino.list()[0], 57600);
//entrada de leds
arduino.pinMode (9,Arduino.OUTPUT);
arduino.pinMode (10,Arduino.OUTPUT);
arduino.pinMode (11,Arduino.OUTPUT);
}
void draw() {
umbral = map(mouseX,0,width,0,256);
if (cam.available() == true) {
cam.read();
transformar();
imgmask.filter (ERODE); // para tener mejor definicion de la sombras
imgmask.filter (DILATE );
imgmask.filter(BLUR,5);
image(imgmask,0,0,width,height);
for (int k=0; k++){
if (area[k] !=0){
stroke(255,0,0);
fill(255,0,0);
rect(map(cmx[k],0,cam.width,0,width),map(cmy[k],0,cam.height,0,height),7,7);// calcula centro de masa
println(area );
//variables para encendido leds blanco
if (area[k]< 88) {
arduino.digitalWrite (9,Arduino.HIGH);
delay (10000);
} else {
arduino.digitalWrite(9,Arduino.LOW);
delay (500);
}
//AZUL
if (area[k] > 76) {
arduino.digitalWrite(10,Arduino.HIGH);
delay (10000);
}else{
arduino.digitalWrite(10,Arduino.LOW);
delay (500);
//verde
if (area[k] < 93) {
arduino.digitalWrite(11,Arduino.HIGH);
delay (10000);
}else{
arduino.digitalWrite(11,Arduino.LOW);
delay (500);
}
}
}
}
}
}
void transformar() {
for (int k=0; k++){
area [k] = 0;
cmx [k] = cmy [k] = 0;
for (int j=0;j
for (int i=k*cam.width/n;i<(k+1)*cam.width/n;i++) { //el width esta divido en n regiones y este es el algoritmo para hacer la division en Y para cada region(donde empieza y donde termina cada region)
ca = cam.get(i,j);
ra = red(ca);
ga = green(ca);
ba = blue(ca);
cb = imgref.get(i,j);
rb = red(cb);
gb = green(cb);
bb = blue(cb);
rt = abs(ra - rb);
gt = abs(ga - gb);
bt = abs(ba - bb);
if ( (rt+gt+bt)/3 < umbral ) {
rt = gt = bt = 0;
} else {
rt = gt = bt = 255;
area[k] ++;
cmx[k] += i;
cmy[k] += j;
}
ct = color(rt,gt,bt);
imgmask.set(i,j,ct);
}
}
if (area[k] != 0) {
cmx[k] = cmx[k]/area[k];
cmy[k] = cmy[k]/area[k];
} else {
cmx[k] = cmy[k] = 0;
}
area[k] = 100*area[k]/(imgmask.width/n*imgmask.height); //normailizaciòn para cada subimagen
}
}
void keyPressed() {
if (key==' ') {
imgref.copy(cam,0,0,cam.width,cam.height,0,0,imgref.width,imgref.height);
}
}
este código es de intensidad del leds según la posición del mouse, la idea seria poder organizarlo para que la función del mouse la realice la presencia del espectador,
import processing.serial.*;
import cc.arduino.*;
Arduino arduino;
void setup() {
size(800,600); //tamaño de la pantalla
arduino = new Arduino(this, Arduino.list()[0], 57600); // MAC
arduino.pinMode(8, Arduino.OUTPUT);
arduino.pinMode(9, Arduino.OUTPUT);
arduino.pinMode(10, Arduino.OUTPUT);
arduino.pinMode(11, Arduino.OUTPUT);
}
void draw() {
arduino.analogWrite (8,int(map(mouseX,0,width,0,255)));
arduino.analogWrite (9,int(map(mouseX,0,width,0,255)));
arduino.analogWrite (10,int(map(mouseX,0,width,0,255)));
arduino.analogWrite (11,int(map(mouseX,0,width,0,255)));
}