processing

Processing ejecutando la detección de presencia, determinando un centro de masa de la imagen umbralizada

El código de Processing para detectar la presencia de un espectador y en consecuencia apagar o enceder las luces de los objetos lumínicos es el siguiente:

// uso "descriptores" para contar los px blancos y determinar presencia
// import codeanticode.gsvideo.*;
import processing.serial.*;
import cc.arduino.*;
import processing.video.*;              // MAC

Arduino arduino; //objeto que representa el arduino para processing

// GSCapture cam;
Capture cam;                            // MAC
PImage imgref;
PImage imgout;

color ca;
float ra,ga,ba;
color cb;
float rb,gb,bb;
color ct;
float rt,gt,bt;

float L;
float umbral;
float ubicacionX;

float area;
float xcm,ycm;

void setup() {

 size(320, 240);

 // cam = new GSCapture(this, 320, 240);
 cam = new Capture(this, 320, 240);      // MAC
 imgref = createImage(cam.width,cam.height,RGB);
 imgout = createImage(cam.width,cam.height,RGB);
 arduino = new Arduino (this,Arduino.list() [0],57600); //constructor, this,5760"COM4",baudios (velocidad de firmata)
 arduino.pinMode (8,Arduino.OUTPUT); //en arduino es pinMode (9,OUTPUT)
 arduino.pinMode (9,Arduino.OUTPUT); //en arduino es pinMode (9,OUTPUT)
}

void draw() {
 //mapeo umbral y posicion en eje X
 umbral = map (mouseY,0,width,0,256);
 ubicacionX = map (xcm,0,width,0,100);
 println (ubicacionX);

 if (cam.available() == true) {
 cam.read();
 transformar();
 image(imgout,0,0,width,height);
 //println (area);
 fill(255,0,0);
 rect (xcm,ycm,5,5);//dibujo rect rojo sobre el centro de masa
 }
 if (ubicacionX < 33 ) {
 arduino.digitalWrite (8,Arduino.HIGH);//pin en que conecte luz 1
 delay (1000);}
 else {
 arduino.digitalWrite (8,Arduino.LOW);
 delay (500);
 }
 if (ubicacionX > 66 ) {
 arduino.digitalWrite (9,Arduino.HIGH);//pin en que conecte luz 2
 delay (1000);}
 else {
 arduino.digitalWrite (9,Arduino.LOW);
 delay (500);
 }
 }

void transformar() {

 area = 0;
 xcm = 0;
 ycm = 0;

 for (int j=0;j<cam.height;j++) {
 for (int i=0;i<cam.width;i++) {

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

 L = (rt + gt + bt)/3;

 if (L<umbral) {
 rt = gt = bt = 0;//px negro
 } else {
 rt = gt = bt = 255;//fuerzo px blanco
 area++;//le sumo 1 al area inicial para sumar px blancos
 xcm += i;
 ycm += j;
 }

 ct = color(rt,gt,bt);

 imgout.set(i,j,ct);

 }
 }
 if (area != 0) {//!= "no es igual" xq si divido x 0 daria error!
 xcm = xcm/area;
 ycm = ycm/area;
 } else
 xcm = ycm = 0;
 //normalizo el area
 area = 100*area/(cam.width*cam.height);

 //ubicacionX = map (xcm,0,width,0);//quiero obtener ubicacion en X

}

void keyPressed() {

 if (key == ' ') {
 imgref.copy(cam,0,0,cam.width,cam.height,0,0,imgref.width,imgref.height);
 } 

}