52
edits
Changes
→Visualization
* Functional Diagrams and Visual Concept
[[Image:Vis145b midterm.jpg|800px|thumb|left]]
==Documentation==
* Source Code
The coding contains two files, the main coding and the Cell object
Main file:
-adapts OpenCV's face tracking code and creates the maze (composed of Cell objects)
import hypermedia.video.*;
import ddf.minim.*;
OpenCV opencv;
// contrast/brightness values
int contrast_value = 0;
int brightness_value = 0;
int cellsize = 100;
int cellnum = 42;
boolean start = true;
int currentcell = 0;
int in_cell = 0;
boolean move = false;
Cell[] cells = new Cell[cellnum];
PImage pacman;
PImage pacmanAlpha;
AudioPlayer player;
Minim minim;
int playercounter = 0;
void setup() {
size( 700, 600 );
minim = new Minim(this);
player = minim.loadFile("StartGame.mp3");
player.loop();
pacman = loadImage("pacman.png");
pacmanAlpha = loadImage("pacmanalpha3.png");
opencv = new OpenCV( this );
opencv.capture( width, height ); // open video stream
opencv.cascade( OpenCV.CASCADE_FRONTALFACE_ALT ); // load detection description, here-> front face detection : "haarcascade_frontalface_alt.xml"
int k = -cellsize;
//int[] temp = { -1, -2, -3, -4, -5 };
for(int i = 0; i < cellnum; i++) {
if(i%(width/cellsize) == 0) { k+= cellsize; }
cells[i] = new Cell(i, (i%(width/cellsize))*cellsize, k, cellsize);
}
setupAllNeighbors();
// print usage
println( "Drag mouse on X-axis inside this sketch window to change contrast" );
println( "Drag mouse on Y-axis inside this sketch window to change brightness" );
}
public void stop() {
opencv.stop();
super.stop();
}
void draw() {
// grab a new frame
// and convert to gray
opencv.read();
opencv.flip( OpenCV.FLIP_HORIZONTAL );
//opencv.convert( GRAY );
opencv.contrast( contrast_value );
opencv.brightness( brightness_value );
// proceed detection
Rectangle[] faces = opencv.detect( 1.2, 2, OpenCV.HAAR_DO_CANNY_PRUNING, 40, 40 );
// display the image
image( opencv.image(), 0, 0 );
noStroke();
fill(255);
// rect(0, 0, width, height);
boolean r;
drawMaze();
if(start == false) { cells[currentcell].cellOn(true); }
for(int l = 0; l<cellnum; l++) {
r = false;
if(cells[l].stepped == true) { r = true; }
cells[l].circleOn(r);
}
// draw face area(s)
for( int i=0; i<faces.length; i++ ) {
noFill();
stroke(255,0,0);
strokeWeight(5);
//rect( faces[i].x, faces[i].y, faces[i].width, faces[i].height );
noStroke();
fill(0, 0, 200, 80);
in_cell = findClosestCell(faces[i].x + (faces[i].width)/2, faces[i].y);
//ellipse(faces[i].x + (faces[i].width)/2, faces[i].y + (faces[i].height)/2, 100, 100);
//ellipse(faces[i].x + (faces[i].width)/2, faces[i].y, 100, 100);
//ellipse(cells[in_cell].x, cells[in_cell].y, 100, 100);
if(start == true) { cells[in_cell].cellOn(); currentcell = in_cell; start = false; }
for(int j = 0; j < 4; j++) {
if(cells[currentcell].neighbors[j] == in_cell) { move = true; }
}
if(move == true) {
cells[in_cell].cellOn();
currentcell = in_cell;
}
move = false;
}
}
/**
* Changes contrast/brigthness values
*/
void mouseDragged() {
contrast_value = (int) map( mouseX, 0, width, -128, 128 );
brightness_value = (int) map( mouseY, 0, width, -128, 128 );
}
int findClosestCell(int face_x, int face_y) {
int cellx; int celly;
int xhundred = (face_x / 100) * 100;
int xten = face_x % 100;
int yhundred = (face_y / 100) * 100;
int yten = face_y % 100;
if(xten > 85) { if(xhundred < 600) { cellx = xhundred + 100; } else { cellx = xhundred; } }
else if(xten < 15) { if(xhundred > 100) { cellx = xhundred - 100; } else { cellx = xhundred; } }
else { cellx = xhundred; }
if(yten > 85) { if(yhundred < 500) { celly = yhundred + 100; } else { celly = yhundred; } }
else if(yten < 15) { if(yhundred > 100) { celly = yhundred - 100; } else { celly = yhundred; } }
else { celly = yhundred; }
return (cellx/100) + (celly/100)*(width/cellsize);
}
void setupNeighbors(int cell, int[] arrayOfNeighbors) {
//cell neighbor set up
//cells[0].neighbors[0] = 7;
cells[cell].neighbors = arrayOfNeighbors;
}
void setupAllNeighbors() {
int[] cell0 = { 7, 1, 0, -1 };
int[] cell1 = { 0, 1, 8, -1 };
int[] cell2 = { 2, 3, -1, -2 };
int[] cell3 = { 2, 3, 10, -1 };
int[] cell4 = { 4, 11, 5, -1 };
int[] cell5 = { 5, 4, 6, -2 };
int[] cell6 = { 5, 6, 13, -2 };
int[] cell7 = { 7, 0, 14, -1 };
int[] cell8 = { 8, 1, 15, -2 };
int[] cell9 = { 9, 16, 10, -2 };
int[] cell10 = { 3, 10, 17, 9 };
int[] cell11 = { 4, 11, 12, -2 };
int[] cell12 = { 12, 11, 19, -2 };
int[] cell13 = { 13, 20, 6, -2 };
int[] cell14 = { 14, 7, 21, -2 };
int[] cell15 = { 15, 16, 8, -2 };
int[] cell16 = { 16, 15, 9, -2 };
int[] cell17 = { 17, 10, 24, -2 };
int[] cell18 = { 18, 19, 25, -2 };
int[] cell19 = { 19, 12, 18, -1 };
int[] cell20 = { 20, 13, -2, -1 };
int[] cell21 = { 21, 22, 14, -2 };
int[] cell22 = { 22, 23, 21, -2 };
int[] cell23 = { 23, 22, 24, 30 };
int[] cell24 = { 24, 31, 17, 23 };
int[] cell25 = { 25, 32, 18, 26 };
int[] cell26 = { 26, 27, 25, -2 };
int[] cell27 = { 27, 26, 34, -2 };
int[] cell28 = { 28, 29, 35, -1 };
int[] cell29 = { 29, 30, 28, -2 };
int[] cell30 = { 30, 23, 29, -1 };
int[] cell31 = { 31, 32, 24, -2 };
int[] cell32 = { 31, 32, 33, 25 };
int[] cell33 = { 33, 32, 40, -1 };
int[] cell34 = { 34, 41, 27, -2 };
int[] cell35 = { 35, 36, 28, -2 };
int[] cell36 = { 36, 35, 37, -2 };
int[] cell37 = { 37, 36, -1, -2 };
int[] cell38 = { 38, 39, -2, -1 };
int[] cell39 = { 39, 40, 38, -2 };
int[] cell40 = { 40, 39, 33, -2 };
int[] cell41 = { 41, 34, -2, -1 };
setupNeighbors(0, cell0);
setupNeighbors(1, cell1);
setupNeighbors(2, cell2);
setupNeighbors(3, cell3);
setupNeighbors(4, cell4);
setupNeighbors(5, cell5);
setupNeighbors(6, cell6);
setupNeighbors(7, cell7);
setupNeighbors(8, cell8);
setupNeighbors(9, cell9);
setupNeighbors(10, cell10);
setupNeighbors(11, cell11);
setupNeighbors(12, cell12);
setupNeighbors(13, cell13);
setupNeighbors(14, cell14);
setupNeighbors(15, cell15);
setupNeighbors(16, cell16);
setupNeighbors(17, cell17);
setupNeighbors(18, cell18);
setupNeighbors(19, cell19);
setupNeighbors(20, cell20);
setupNeighbors(21, cell21);
setupNeighbors(22, cell22);
setupNeighbors(23, cell23);
setupNeighbors(24, cell24);
setupNeighbors(25, cell25);
setupNeighbors(26, cell26);
setupNeighbors(27, cell27);
setupNeighbors(28, cell28);
setupNeighbors(29, cell29);
setupNeighbors(30, cell30);
setupNeighbors(31, cell31);
setupNeighbors(32, cell32);
setupNeighbors(33, cell33);
setupNeighbors(34, cell34);
setupNeighbors(35, cell35);
setupNeighbors(36, cell36);
setupNeighbors(37, cell37);
setupNeighbors(38, cell38);
setupNeighbors(39, cell39);
setupNeighbors(40, cell40);
setupNeighbors(41, cell41);
}
void drawMaze() {
stroke(0, 0, 255);
strokeWeight(4);
line(0, 0, 0, height);
line(0, 0, width, 0);
line(width, 0, width, height);
line(0, height, width, height);
line(100, 100, 100, 300);
line(100, 300, 300, 300);
line(300, 300, 300, 200);
line(200, 0, 200, 200);
line(200, 100, 300, 100);
line(0, 400, 200, 400);
line(400, 0, 400, 400);
line(100, 500, 500, 500);
line(300, 400, 300, height);
line(500, 400, 600, 400);
line(400, 200, 500, 200);
line(500, 300, width, 300);
line(500, 100, 600, 100);
line(600, 100, 600,300);
line(600, 400, 600, height);
}