GMU:Sensor Hacklab/Rachel Smith/Link to processing code

From Medien Wiki

import gab.opencv.*; import processing.video.*; import java.awt.*; import processing.serial.*;

Serial myPort; // Create object from Serial class

Capture video; OpenCV opencv; color one; color two; color three; color yes; int trigger; boolean selectMode = true; boolean recording = false;

void setup() {

 size(640, 360);
  String portName = Serial.list()[1]; //set up for arduino
 myPort = new Serial(this, portName, 9600);
 video = new Capture(this, 640, 360);
 opencv = new OpenCV(this, 640, 360);
 opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
 frameRate(30);
 video.start();

}

void draw() {

 //read the colour at the middle of the target
 
color right = get(width-100, height/2);
color left = get(150, height/2);
color down = get(width/2, height - 100);

// println(red(right)); // println(green(left)); // println(blue(down));


 if (red(right)<=245 && green(left) >245 && blue(down) >245) {                            
 trigger = 10;  
 myPort.write(trigger);
 }   
 else if (green(left) <=245 && red(right) >245  && blue(down) >245) {
   trigger = 20;
   myPort.write(trigger);
 }
 else if (blue(down) <=245 && green(left) >245 && red(right) >245) {
   trigger = 30;
   myPort.write(trigger);
 }

println(trigger);

 //draw the 'targets'
 
 //right
 fill(255, 0, 0);
 rect(width-100, height/2, 20, 20);
 
 //left
 fill(0, 255, 0);
 rect(150, height/2, 20, 20);
 
 //down
 fill(0, 0, 255);
 rect(width/2, height -100, 20, 20);
 
 
 if (selectMode) {
   //create mirror image and scale
   pushMatrix();
   scale(-1.5, 1.5);
   translate(40, -80);
   image(video, -width, 0, width, height);
   popMatrix();
   fill(#FAFC6B);
   rect(0, 25, 640, 20);
   fill(#212E9D);
   text("Select three points on eye - hover mouse over and select using up, left and right. When finished, press down.", 7, 40);
 }
 //extract rgb vals from selected colours
 float r1 = red(one);
 float r2 = red(two);
 float r3 = red(three);
 float g1 = green(one);
 float g2 = green(two);
 float g3 = green(three);
 float b1 = blue(one);
 float b2 = blue(two);
 float b3 = blue(three);
 //find max and min rgb vals
 float maxr = max(r1, r2, r3);
 float minr = min(r1, r2, r3);
 float maxg = max(g1, g2, g3);
 float ming = min(g1, g2, g3);
 float maxb = max(b1, b2, b3);
 float minb = min(b1, b2, b3);
 noStroke();
 fill(#FAFC6B, 10);
 rect(0, 0, 640, 360);
 opencv.loadImage(video);
 Rectangle[] faces = opencv.detect();
 loadPixels();
 video.loadPixels();
 if (faces.length !=0) {
   for ( int i =0; i<faces.length; i++) {
     //get colour information from cam
     color [] pxls = video.pixels;
     int count = 0;
     int xsum = 0;
     int ysum = 0;
     //only use data within upper half of face
     for (int y = faces[i].y +int(0.15*(faces[i].y+faces[i].height)); y < faces[i].y+int(0.3*(faces[i].y+faces[i].height)); y++) {
       for (float x =faces[i].x+20; x< faces[i].x+faces[i].width-20; x++) {
         int loc = int(x + y*width);
         if (loc < pxls.length) {
           float r = red(pxls[loc]);
           float g = green(pxls[loc]);
           float b = blue(pxls[loc]);
           if ( r>minr && r<maxr && g >ming && g<maxg && b>minb && b<maxb) {
             // sum the values for x and y
             count = count + 1;
             xsum = xsum + int(x);
             ysum = ysum + y;
             //fill(r, g, b);
           }
         }
       }
     }
     //draw ellipse at average point of eyes 
     if (count !=0) {
       int xmean = xsum/count;
       int ymean = ysum/count;
       translate(60, 0);
       fill(50, 50, 50);
       ellipse(width-xmean, ymean, 17, 17);
      // println(xmean, ymean);
     }
   }
 }
   if (recording) {
   saveFrame("frames-#####.png");
   }

}


void captureEvent(Capture c) {

 c.read();

}

//takes colour at mouse position void keyPressed() {

 if (key == CODED) {
   if (keyCode == UP) {
     one = get(mouseX, mouseY);
     //creates visual feedback
     fill(#FAFC6B);
     ellipse(mouseX, mouseY, 10, 10);
   } 
   else if (keyCode == LEFT) {
     two = get(mouseX, mouseY);
     fill(#FAFC6B);
     ellipse(mouseX, mouseY, 10, 10);
   } 
   else if (keyCode == RIGHT) {
     three = get(mouseX, mouseY);
     fill(#FAFC6B);
     ellipse(mouseX, mouseY, 10, 10);
   }
   else if (keyCode == DOWN) {
     selectMode = !selectMode;
   }
 }

}

void mousePressed() {

 recording = !recording;

}