├── .gitignore ├── Button.pde ├── HaarRect.pde ├── HaarRectSizeComparator.pde ├── HaarcascadeVisualizer.pde ├── Node.pde ├── README.txt ├── Stage.pde ├── Tree.pde ├── cascadeLoader.pde ├── data └── face.jpg ├── haarcascade_eye.xml ├── haarcascade_eye_tree_eyeglasses.xml ├── haarcascade_frontalface_alt.tif ├── haarcascade_frontalface_alt.xml ├── haarcascade_frontalface_alt2.tif ├── haarcascade_frontalface_alt2.xml ├── haarcascade_frontalface_alt_tree.tif ├── haarcascade_frontalface_alt_tree.xml ├── haarcascade_frontalface_default.tif ├── haarcascade_frontalface_default.xml ├── haarcascade_fullbody.xml ├── haarcascade_lefteye_2splits.xml ├── haarcascade_lowerbody.xml ├── haarcascade_mcs_eyepair_big.xml ├── haarcascade_mcs_eyepair_small.xml ├── haarcascade_mcs_lefteye.xml ├── haarcascade_mcs_mouth.xml ├── haarcascade_mcs_nose.xml ├── haarcascade_mcs_righteye.xml ├── haarcascade_mcs_upperbody.xml ├── haarcascade_profileface.xml ├── haarcascade_righteye_2splits.xml └── haarcascade_upperbody.xml /.gitignore: -------------------------------------------------------------------------------- 1 | # OS generated files # 2 | ###################### 3 | .DS_Store* 4 | ehthumbs.db 5 | Icon? 6 | Thumbs.db -------------------------------------------------------------------------------- /Button.pde: -------------------------------------------------------------------------------- 1 | // Daniel Shiffman's button 2 | 3 | class Button { 4 | Rectangle r; //button's rectangle 5 | String txt; //button's text 6 | boolean clicked; //did i click on it? 7 | boolean rollover; //did i rollover it? 8 | 9 | Button(int x, int y, int w, int h, String s) { 10 | r = new Rectangle(x,y,w,h); 11 | txt = s; 12 | } 13 | 14 | void render() { 15 | //draw rectangle and text based on whether rollover or clicked 16 | rectMode(CORNER); 17 | stroke(0); noFill(); 18 | if (rollover) fill(0.5); 19 | if (clicked) fill(0); 20 | rect(r.x,r.y,r.width,r.height); 21 | float b = 0.0; 22 | if (clicked) b = 1; 23 | else if (rollover) b = 0.2; 24 | else b = 0; 25 | fill(b); 26 | textAlign(LEFT); 27 | text(txt,r.x+10,r.y+14); 28 | 29 | } 30 | 31 | 32 | //methods to check rollover, clicked, or released (must be called from appropriate 33 | //places in draw, mousePressed, mouseReleased 34 | boolean rollover(int mx, int my) { 35 | if (r.contains(mx,my)) rollover = true; 36 | else rollover = false; 37 | return rollover; 38 | } 39 | 40 | boolean clicked(int mx, int my) { 41 | if (r.contains(mx,my)) clicked = true; 42 | return clicked; 43 | } 44 | 45 | void released() { 46 | clicked = false; 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /HaarRect.pde: -------------------------------------------------------------------------------- 1 | class HaarRect{ 2 | 3 | int dx,dy,dw,dh,dweight,sx,sy,sw,sh,sweight; 4 | 5 | HaarRect(int[] d){ 6 | dx = d[0]; 7 | dy = d[1]; 8 | dw = d[2]; 9 | dh = d[3]; 10 | dweight = d[4]; 11 | } 12 | 13 | int getArea(){ 14 | return sw*sw; 15 | } 16 | 17 | void setScale(int s){ 18 | sx = int( dx * s ); 19 | sy = int( dy * s ); 20 | sw = int( dw * s ); 21 | sh = int( dh * s ); 22 | } 23 | 24 | void setScaleWeight(int s){ 25 | sweight = dweight * s; 26 | } 27 | 28 | Rectangle getRectangle(){ 29 | return new Rectangle(dx,dy,dw,dh); 30 | } 31 | 32 | 33 | } 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /HaarRectSizeComparator.pde: -------------------------------------------------------------------------------- 1 | 2 | public class HaarRectSizeComparator implements Comparator { 3 | 4 | public int compare(Object h1, Object h2) { 5 | 6 | int a1 = ((HaarRect) h1).getArea(); 7 | 8 | int a2 = ((HaarRect) h2).getArea(); 9 | 10 | if (a1 > a2) 11 | 12 | return 1; 13 | 14 | else if (a1 < a2) 15 | 16 | return -1; 17 | 18 | else 19 | return 0; 20 | 21 | } 22 | 23 | } 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /HaarcascadeVisualizer.pde: -------------------------------------------------------------------------------- 1 | /********************************************************************************* 2 | * Haar Feature Visualizer 3 | * 4 | * Summary: Creates a visual reference for haar features 5 | * Author: Adam Harvey / http://ahprojects.com 6 | * License: Free.99, permissing 7 | * Tested with Processing 2.0a4 8 | * Warning: you need the old XML library 9 | * Using XML instead of XMLElement throws errors with getChild() 10 | ********************************************************************************/ 11 | 12 | /********************************************************************************* 13 | * 14 | * Notes 15 | * Only visualizes the first nodes, some trees have several nodes and add'l nodes are not included 16 | * There are some things that it does not visualize yet such as threshold and right/left values 17 | * Improvements welcome. Contact me at http://ahprojects.com/about for suggestions, comments, ideas 18 | * 19 | ********************************************************************************/ 20 | 21 | 22 | // ------------------------------------------------------------------------ 23 | // START Editable Parameters 24 | // Cascade file 25 | String cascadeFile = "haarcascade_frontalface_default.xml"; 26 | 27 | 28 | // Choose amount of white space around the image 29 | int margin = 0; 30 | // Color of the image background 31 | color imgBgColor = color(200); 32 | 33 | // Choose draw mode 34 | // 0 = Contact sheet, showing first haar feature of each stage 35 | // 1 = All haar features, one file per stage in folder named after xml file 36 | int drawMode = 0; 37 | 38 | // Open files after rendered? 39 | boolean openFiles = false; 40 | 41 | // END Editable Parameters 42 | // ------------------------------------------------------------------------ 43 | 44 | import processing.xml.*; 45 | import java.awt.Rectangle; 46 | import interfascia.*; 47 | 48 | // Interface elements 49 | IFTextField t; 50 | GUIController c; 51 | IFButton bFirst, bAll; 52 | IFCheckBox cb; 53 | PFont font1, font2; 54 | 55 | // Logic 56 | boolean doProcess; 57 | boolean hasErrors = false; 58 | String statusMsg = ""; 59 | int idCur; 60 | 61 | // GUI 62 | ArrayList