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