/** * * Doing some stuff with video. */ // to connect to remote sql db, use ssh tunneling / port forwarding: // ssh -fNg -L 3306:localhost:3306 192.168.0.152 // to connect to remote disk: // Finder->Go->Connect To Servers // afp://192.168.0.152 // mount volume Reservoir import hypermedia.video.*; import java.awt.Rectangle; import de.bezier.data.sql.*; import processing.video.*; //Movie myMovie; SteppedMovie myMovie; int FRAME_W = 1280; int FRAME_H = 720; String file_name; long totalframes=0; // ---- 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; // ---- face imagery ---- // ArrayList faceIDs; ArrayList videoIDs; ArrayList framenums; ArrayList xpos; ArrayList ypos; ArrayList widths; ArrayList heights; int framenum = 0; // ---- 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/frames/"; String outpath="/Volumes/extra/frames/"; // ---- 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(); j=11; 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"); msql.query("SELECT DISTINCT(video_id) FROM "+table+" ORDER BY video_id"); while(msql.next()) { video_id=msql.getInt("video_id"); videoIDs.add(video_id); println(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()) { 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; totalframes=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++; totalframes++; 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); //drawFace(10, 10, 500, 500); // 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(); } } } 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) { myMovie.loadPixels(); PImage frameimg = new PImage(myMovie.width, myMovie.height, RGB); arraycopy(myMovie.pixels, frameimg.pixels); frameimg.updatePixels(); int rw=round((Integer)widths.get(k)*1.777777777777778); int xoff=(rw/4); // PImage face = frameimg.get((Integer)xpos.get(k),(Integer) ypos.get(k),(Integer) widths.get(k),(Integer) heights.get(k)); PImage face = frameimg.get((Integer)xpos.get(k)-xoff,(Integer) ypos.get(k), rw,(Integer) heights.get(k)); image(face, x, y, rw, h); face.resize(FRAME_W, FRAME_H); face.save(savePath(outpath+"/"+file_name+"/"+file_name+String.format("%07d",totalframes)+".tif")); } 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(); //}