/** * * Doing some stuff with video. */ import hypermedia.video.*; import java.awt.Rectangle; import de.bezier.data.sql.*; import processing.video.*; //Movie myMovie; SteppedMovie myMovie; // ---- face tracking stuff ---- PImage img; PImage frameimg; PFont font; int filenum=257; int facenum=0; int frame=0; int id=0; int video_id=0; int face_id=0; int i=0; int j=0; int k=0; int startframe=67423; float moviepos=519.8; float lasttime=0; boolean newframe=false; // ---- face imagery ---- // ArrayList faceIDs; ArrayList videoIDs; ArrayList framenums; ArrayList xpos; ArrayList ypos; ArrayList widths; ArrayList heights; int framenum = 0; float WIDTHOUT=1280; float HEIGHTOUT=720; float RATIO=WIDTHOUT/HEIGHTOUT; // ---- interactivity ---- // // timing int last=0; boolean paused=false; ////String inpath="/Volumes/tera 4/Assets/Video"; //String inpath="/Volumes/Reservoir/Assets/Video"; ////String fname="abby gas station"; //String fname="IR movie 1.mov"; //String outpath="/Users/rtwomey/Desktop/"+fname+"_"+DETECTION_CASCADE; // ---- database for face information ---- // MySQL msql; String user="bob"; String pass="password"; String database="looking"; String table="faces"; void setup() { size(1280, 720, P2D); //size(screen.width, screen.height); background(0); strokeWeight(2); noFill(); // Font and text drawing setup font = loadFont("HelveticaNeue-48.vlw"); textAlign(LEFT); // textAlign(CENTER,CENTER); rectMode(CORNER); fill(255); textFont(font, 24); last=-1000; // connect do db for face-tracking msql = new MySQL( this, "localhost", database, user, pass ); if ( !msql.connect() ) { // connection failed ! println("connection failed!"); exit(); } retrieveVideoIDs(); nextMovie(); } void retrieveVideoIDs() { // query faces table for faces with width > 100 videoIDs = new ArrayList(); msql.query("SELECT DISTINCT(video_id) FROM "+table+" WHERE width > 150"); while(msql.next()) { video_id=msql.getInt("video_id"); videoIDs.add(video_id); } println(videoIDs.size()+" video files"); if(videoIDs.size()<=0) exit(); } void retrieveFaceIDs() { // query faces table for faces with width > 100 faceIDs = new ArrayList(); // msql.query("SELECT DISTINCT(face_id) FROM "+table+" WHERE video_id="+video_id+" AND width> 150 ORDER BY face_id"); msql.query("SELECT DISTINCT(face_id) FROM "+table+" WHERE video_id="+video_id+" ORDER BY face_id"); while(msql.next()) { face_id=msql.getInt("face_id"); faceIDs.add(face_id); } println(faceIDs.size()+" faces in video file "+video_id); if(faceIDs.size()<=0) exit(); } void loadMovie() { video_id=(Integer)videoIDs.get(j); msql.query("SELECT * FROM media WHERE id="+video_id); while(msql.next()) { String file_name = msql.getString("fname"); String path=msql.getString("path"); print(" opening video_id "+video_id+" "+path+"/"+file_name+". "); // open movie file myMovie = new SteppedMovie(this, savePath(path+"/"+file_name)); myMovie.precalcFrameTimes(); myMovie.read(); println("file is "+myMovie.getFrameCount()+" frames long."); retrieveFaceIDs(); i=0; face_id=(Integer)faceIDs.get(i); if(getFaceInfo()<0) nextFaceSequence(); } } void previousMovie() { j--; if(j<0)j=videoIDs.size()-1; loadMovie(); } void nextMovie() { j++; if(j>=videoIDs.size())j=0; loadMovie(); } void previousFaceSequence() { i--; if(i<0) { previousMovie(); } println(i); face_id=(Integer)faceIDs.get(i); if(getFaceInfo()<0) previousFaceSequence(); k=0; } void nextFaceSequence() { i++; if(i>=faceIDs.size()) { i=0; nextMovie(); } face_id=(Integer)faceIDs.get(i); if(getFaceInfo()<0) nextFaceSequence(); k=0; } int getFaceInfo() { // get face tracking coords for video framenums = new ArrayList(); xpos = new ArrayList(); ypos = new ArrayList(); widths = new ArrayList(); heights = new ArrayList(); msql.query("SELECT frame_num, x_pos, y_pos, width, height FROM faces WHERE face_id="+face_id+" AND video_id="+video_id); println(" querying info for face_id "+face_id+" and video_id "+video_id); while(msql.next()) { framenums.add(msql.getInt("frame_num")); xpos.add(msql.getInt("x_pos")); ypos.add(msql.getInt("y_pos")); widths.add(msql.getInt("width")); heights.add(msql.getInt("height")); } print(" face series is "+framenums.size()+" frames long."); k=0; if(framenums.size()>10) { framenum = (Integer)framenums.get(k); println(" going to frame "+framenum); myMovie.gotoFrameNumber(framenum); } else { println(" skipping face series. too short."); return -1; }; return 1; } void draw() { if((!paused)) { // erase image and put curr video frame myMovie.read(); k++; if(k>=framenums.size())nextFaceSequence(); framenum=(Integer)framenums.get(k); myMovie.gotoFrameNumber(framenum); if(myMovie.done()) { nextMovie(); } else { background(0); // draw movie // image(myMovie, 0, 0); // draw box // stroke(0, 0, 255); // rect((Integer)xpos.get(k),(Integer) ypos.get(k),(Integer) widths.get(k),(Integer) heights.get(k)); // draw face drawFace(10, 10); // draw text fill(64, 64, 64); text(myMovie.time()+" s\n"+myMovie.getCurrentFrameNumber()+"\n"+myMovie.getFrameCount()+" frames\n"+face_id+" face_id\n"+video_id+" video_id\n"+k+" of "+(Integer)framenums.size(), 10, height-180); // draw timeline indicator int linepos=round(map(myMovie.getCurrentFrameNumber(), 0, myMovie.getFrameCount(), 0, width)); stroke(128); line(linepos, height-50, linepos, height); noFill(); newframe=false; } } } void drawFace(int x, int y) { drawFace(x, y, (Integer) widths.get(k),(Integer) heights.get(k)); } void drawFace(int x, int y, int w, int h) { int fx, fy, fw, fh, rw, rx; myMovie.loadPixels(); PImage frameimg = new PImage(myMovie.width, myMovie.height, RGB); arraycopy(myMovie.pixels, frameimg.pixels); frameimg.updatePixels(); fx=(Integer)xpos.get(k); fy=(Integer)ypos.get(k); fw=(Integer)widths.get(k); fh=(Integer)heights.get(k); rw=round((float)fw*RATIO); rx=round(fx-((rw-fw)/2.0)); fx=rx; fw=rw; println(fx+" "+fy+" "+fw+" "+fh); PImage face = frameimg.get(fx, fy, fw, fh); image(face, x, y, fw, fh); } void saveSnapShot() { //myMovie.save(savePath("/Users/rtwomey/Desktop/images/"+vidName)); save("snapshot_"+str(myMovie.time())); } void mousePressed() { int fnum=round(float(mouseX)/float(width)*myMovie.getFrameCount()); println("jumping to frame "+fnum); myMovie.gotoFrameNumber(fnum); } void keyPressed() { if(key==' ') paused = (paused == true) ? false : true; if(key=='s') saveSnapShot(); if(keyCode==RIGHT)nextFaceSequence(); if(keyCode==LEFT)previousFaceSequence(); } //public void stop() { // agents.stop(); // super.stop(); //}