diff options
| author | Tim Redfern <tim@eclectronics.org> | 2014-03-14 14:07:28 +0000 |
|---|---|---|
| committer | Tim Redfern <tim@eclectronics.org> | 2014-03-14 14:07:28 +0000 |
| commit | bcf4c0ac5428a1c3f331d66cf0c4a301d1f7a45f (patch) | |
| tree | ef4011c68ae756815aa47da218029801e9c56ec6 | |
| parent | bb852cee91b52b71fccade7d4a1ef065eb0de2f0 (diff) | |
nearly ready
| -rw-r--r-- | offsetProject/bin/data/screenleft.png | bin | 0 -> 17594 bytes | |||
| -rw-r--r-- | offsetProject/bin/data/screenright.png | bin | 0 -> 9734 bytes | |||
| -rw-r--r-- | offsetProject/src/buttonChecker.cpp | 8 | ||||
| -rw-r--r-- | offsetProject/src/buttonChecker.h | 72 | ||||
| -rw-r--r-- | offsetProject/src/imageStore.h | 87 | ||||
| -rw-r--r-- | offsetProject/src/ofApp.cpp | 168 | ||||
| -rw-r--r-- | offsetProject/src/ofApp.h | 6 |
7 files changed, 274 insertions, 67 deletions
diff --git a/offsetProject/bin/data/screenleft.png b/offsetProject/bin/data/screenleft.png Binary files differnew file mode 100644 index 0000000..eca31d1 --- /dev/null +++ b/offsetProject/bin/data/screenleft.png diff --git a/offsetProject/bin/data/screenright.png b/offsetProject/bin/data/screenright.png Binary files differnew file mode 100644 index 0000000..6fe6bad --- /dev/null +++ b/offsetProject/bin/data/screenright.png diff --git a/offsetProject/src/buttonChecker.cpp b/offsetProject/src/buttonChecker.cpp new file mode 100644 index 0000000..b8170e8 --- /dev/null +++ b/offsetProject/src/buttonChecker.cpp @@ -0,0 +1,8 @@ +#include "buttonChecker.h" + +long ofToLong(const string& intString) { + long x = 0; + istringstream cur(intString); + cur >> x; + return x; +}
\ No newline at end of file diff --git a/offsetProject/src/buttonChecker.h b/offsetProject/src/buttonChecker.h new file mode 100644 index 0000000..2de14cb --- /dev/null +++ b/offsetProject/src/buttonChecker.h @@ -0,0 +1,72 @@ +#ifndef _BUTTON_CHECK +#define _BUTTON_CHECK + +#include "ofMain.h" +#include "ofURLFileLoader.h" + +long ofToLong(const string& intString); + +class buttonChecker : public ofThread{ + + public: + + float interval; //time between refreshes in seconds + std::string url; + long last; + float triggerTime; + bool active; + + buttonChecker(){ + url = "http://tycleeson.com/trigger.php"; + interval=0.05; + last=0; + triggerTime=0.0f; + active=false; + } + + void set_interval(float _interval){ + interval=_interval; + } + + void start(){ + startThread(true, false); // blocking, verbose + } + + void stop(){ + stopThread(); + } + + bool action(){ + if(active){ + active=false; + return true; + } + return false; + } + + + //-------------------------- + void threadedFunction(){ + + cout << "Api: " << url<<endl; + + while( isThreadRunning() != 0 ){ + + //cout<<"."<<std::flush; + + long result = ofToLong(ofLoadURL(url).data.getText()); + if (result>last){ + last=result; + active=true; + triggerTime=ofGetElapsedTimef(); + } + + + ofSleepMillis(interval * 1000); + } + } + + +}; + +#endif
\ No newline at end of file diff --git a/offsetProject/src/imageStore.h b/offsetProject/src/imageStore.h index 9cde96c..2f8ccbb 100644 --- a/offsetProject/src/imageStore.h +++ b/offsetProject/src/imageStore.h @@ -7,6 +7,9 @@ #define FLANN_MATRIX_SIZE 5 +#define INSTAGRAM_DISPLAY_TIME 5 +#define IMAGE_FREEZE_TIME 5 + #include "ofMain.h" #include "ofxJSONElement.h" #include "ofxOpenCv.h" @@ -29,6 +32,9 @@ class imageStore : public ofThread{ std::map<std::string,ofImage> images; vector<ofImage*> imageptrs; deque<std::string> to_update; + bool newinstagram; + ofImage instagram_image; + float newinstagramtime; //Matrix<float> dataset; doesn't need to be retained? @@ -56,7 +62,7 @@ class imageStore : public ofThread{ img.update(); images["000000"]=img; //colours["000000"]=ofColor(0,0,0); - + newinstagram=false; } ~imageStore(){ delete index; @@ -161,6 +167,46 @@ class imageStore : public ofThread{ } } + bool new_instagram(){ + if (newinstagram){ + if( lock() ){ + loadtexture(instagram_image); + newinstagram=false; + newinstagramtime=ofGetElapsedTimef(); + unlock(); + return true; + } + } + return false; + } + + bool drawinstagram(int x,int y,int w,int h){ + if( lock() ){ + instagram_image.draw(x,y,w,h); + unlock(); + } + if (ofGetElapsedTimef()-newinstagramtime>INSTAGRAM_DISPLAY_TIME) return false; + return true; + } + + void instagram_floats(float* floatImage){ + if( lock() ){ + + int size=ceil(ofGetHeight()/MAX_TILE_SIZE)*FLANN_MATRIX_SIZE; + ofImage imm=instagram_image; + imm.resize(size,size); + uint8_t* cptr=imm.getPixels(); + for (int i=0;i<size;i++){ + for (int j=0;j<size;j++){ + floatImage[(i*size+j)*3]=cptr[(i*size+j)*3]; + floatImage[(i*size+j)*3+1]=cptr[(i*size+j)*3+1]; + floatImage[(i*size+j)*3+2]=cptr[(i*size+j)*3+2]; + } + } + unlock(); + } + } + //void flann(const ofImage& _img){ //-------------------------- @@ -178,6 +224,9 @@ class imageStore : public ofThread{ ofImage img; img.setUseTexture(false); img.loadImage(ofToString(IMAGE_STORE_SIZE)+"/"+image_path.getFiles()[i].getFileName()); + + if (i==image_path.size()-1) instagram_image=img; + img.resize(MAX_TILE_SIZE,MAX_TILE_SIZE); //colours[image_path.getFiles()[i].getBaseName()]=get_colour(img); @@ -193,6 +242,8 @@ class imageStore : public ofThread{ image_path.create(); } + + //build the flann index Matrix<float> dataset(&data[0],data.size()/(3*FLANN_MATRIX_SIZE*FLANN_MATRIX_SIZE),3*FLANN_MATRIX_SIZE*FLANN_MATRIX_SIZE); index= new Index<L2<float> >(dataset, KDTreeIndexParams(4)); @@ -205,7 +256,7 @@ class imageStore : public ofThread{ while( isThreadRunning() != 0 ){ - /* + cout<<"."<<std::flush; if (!response.open(instagram_url)) { @@ -225,29 +276,57 @@ class imageStore : public ofThread{ ofImage img; img.setUseTexture(false); img.loadImage(url); + if( lock() ){ + instagram_image=img; + unlock(); + } img.resize(IMAGE_STORE_SIZE,IMAGE_STORE_SIZE); img.saveImage(ofToString(IMAGE_STORE_SIZE)+"/"+id+".png"); img.resize(MAX_TILE_SIZE,MAX_TILE_SIZE); if( lock() ){ + newinstagram=true; colours[id]=get_colour(img); + add_data(img); images[id]=img; + imageptrs.push_back(&images[id]); to_update.push_back(id); + //rebuild the flann index + float t=ofGetElapsedTimef(); + delete index; + Matrix<float> dataset(&data[0],data.size()/(3*FLANN_MATRIX_SIZE*FLANN_MATRIX_SIZE),3*FLANN_MATRIX_SIZE*FLANN_MATRIX_SIZE); + index= new Index<L2<float> >(dataset, KDTreeIndexParams(4)); + index->buildIndex(); + cout<<"rebuilt flann index of "<<data.size()/(3*FLANN_MATRIX_SIZE*FLANN_MATRIX_SIZE)<<" images in "<<(ofGetElapsedTimef()-t)<<"seconds"<<endl; unlock(); } } } } - */ + ofSleepMillis(interval * 1000); } } + void loadtexture(ofImage& im){ + const ofPixels& pix = im.getPixelsRef(); + im.getTextureReference().allocate( + pix.getWidth() + ,pix.getHeight() + ,ofGetGlInternalFormat(pix) + ); + + im.setUseTexture(true); + im.update(); + } + void update(){ //loads one texture if( lock() ){ if (to_update.size()){ std::string im = to_update.front(); + loadtexture(images[im]); +/* const ofPixels& pix = images[im].getPixelsRef(); images[im].getTextureReference().allocate( pix.getWidth() @@ -257,7 +336,7 @@ class imageStore : public ofThread{ images[im].setUseTexture(true); images[im].update(); - +*/ to_update.pop_front(); /* diff --git a/offsetProject/src/ofApp.cpp b/offsetProject/src/ofApp.cpp index c5163f9..694c592 100644 --- a/offsetProject/src/ofApp.cpp +++ b/offsetProject/src/ofApp.cpp @@ -19,6 +19,11 @@ performance? use opencv to convert to floats? its a quick one.. +1. reinstate instagram adding +2. the button - saving images +3. tile scaling +4. performance - look + */ //-------------------------------------------------------------- void ofApp::setup() { @@ -52,6 +57,9 @@ void ofApp::setup() { tiledata=new float[FLANN_MATRIX_SIZE*FLANN_MATRIX_SIZE*3]; frametiledata=new float[FLANN_MATRIX_SIZE*FLANN_MATRIX_SIZE*3*h*h]; + + screenleft.loadImage("screenleft.png"); + screenright.loadImage("screenright.png"); } //-------------------------------------------------------------- @@ -59,88 +67,108 @@ void ofApp::update() { ofSetWindowTitle(ofToString(ofGetFrameRate())); - kinect.update(); + //prepare buffers etc + //decide whether to use kinect, to keep kinect photo frozen, or to display from instagram - // there is a new frame and we are connected - if(kinect.isFrameNew()) { - depthImage.setFromPixels(kinect.getDepthPixels(), kinect.width, kinect.height); - colourImage.setFromPixels(kinect.getPixels(), kinect.width, kinect.height); - depthImage.threshold(farThreshold); + if (store.new_instagram()){ + mode=MODE_DRAWINSTAGRAM; + } - //threshold needs to be multiplied by the original - depthImage2.setFromPixels(kinect.getDepthPixels(), kinect.width, kinect.height); - depthImage*=depthImage2; + store.update(); - //depthImage.extend(extend_w,extend_h); - //colourImage.extend(extend_w,extend_h); + switch(mode){ + case MODE_DRAWINSTAGRAM: + case MODE_FROZEN: + break; + default: + kinect.update(); - int h=ceil(ofGetHeight()/MAX_TILE_SIZE); - int w=(h*4)/3; - depthImage.resize(w,h); - + // there is a new frame and we are connected + if(kinect.isFrameNew()) { - int fh=h*FLANN_MATRIX_SIZE; - int fw=w*FLANN_MATRIX_SIZE; - colourImage.resize(fw,fh); + depthImage.setFromPixels(kinect.getDepthPixels(), kinect.width, kinect.height); + colourImage.setFromPixels(kinect.getPixels(), kinect.width, kinect.height); - //cerr<<"needed: "<<h<<"*"<<FLANN_MATRIX_SIZE<<"*"<<h<<"*"<<FLANN_MATRIX_SIZE<<"*3"<<endl; + depthImage.threshold(farThreshold); + //threshold needs to be multiplied by the original + depthImage2.setFromPixels(kinect.getDepthPixels(), kinect.width, kinect.height); + depthImage*=depthImage2; - int kinexstart=(colourImage.getWidth()/2)+(colourImage.getHeight()/2); - uint8_t* cptr=colourImage.getPixels(); - for (int i=0;i<fh;i++){ - for (int j=0;j<fh;j++){ - floatImage[(i*fh+j)*3]=cptr[(((i*fw)+kinexstart)-j)*3]; - floatImage[(i*fh+j)*3+1]=cptr[(((i*fw)+kinexstart)-j)*3+1]; - floatImage[(i*fh+j)*3+2]=cptr[(((i*fw)+kinexstart)-j)*3+2]; - } - } -/* - store.flann(cptr,w,h); - - int tilestep=(FLANN_MATRIX_SIZE*FLANN_MATRIX_SIZE*3); - for (int i=0;i<h;i++){ - for (int j=0;j<w;j++){ - for (int k=0;k<FLANN_MATRIX_SIZE;k++){ - for (int l=0;l<FLANN_MATRIX_SIZE;l++){ - frametiledata[((k*FLANN_MATRIX_SIZE+l)*3)+(tilestep*(j*w+i))]=cptr[((i*FLANN_MATRIX_SIZE+k)*fw+kinexstart)-(j*FLANN_MATRIX_SIZE+l))*3]; - frametiledata[((k*FLANN_MATRIX_SIZE+l)*3)+(tilestep*(j*w+i))]=cptr[((i*FLANN_MATRIX_SIZE+k)*fw+kinexstart)-(j*FLANN_MATRIX_SIZE+l))*3]; - frametiledata[((k*FLANN_MATRIX_SIZE+l)*3)+(tilestep*(j*w+i))]=cptr[((i*FLANN_MATRIX_SIZE+k)*fw+kinexstart)-(j*FLANN_MATRIX_SIZE+l))*3]; + //depthImage.extend(extend_w,extend_h); + //colourImage.extend(extend_w,extend_h); + + int h=ceil(ofGetHeight()/MAX_TILE_SIZE); + int w=(h*4)/3; + depthImage.resize(w,h); + + + int fh=h*FLANN_MATRIX_SIZE; + int fw=w*FLANN_MATRIX_SIZE; + colourImage.resize(fw,fh); + + //cerr<<"needed: "<<h<<"*"<<FLANN_MATRIX_SIZE<<"*"<<h<<"*"<<FLANN_MATRIX_SIZE<<"*3"<<endl; + + + int kinexstart=(colourImage.getWidth()/2)+(colourImage.getHeight()/2); + uint8_t* cptr=colourImage.getPixels(); + for (int i=0;i<fh;i++){ + for (int j=0;j<fh;j++){ + floatImage[(i*fh+j)*3]=cptr[(((i*fw)+kinexstart)-j)*3]; + floatImage[(i*fh+j)*3+1]=cptr[(((i*fw)+kinexstart)-j)*3+1]; + floatImage[(i*fh+j)*3+2]=cptr[(((i*fw)+kinexstart)-j)*3+2]; } } - } - } -*/ + /* + store.flann(cptr,w,h); + + int tilestep=(FLANN_MATRIX_SIZE*FLANN_MATRIX_SIZE*3); + for (int i=0;i<h;i++){ + for (int j=0;j<w;j++){ + for (int k=0;k<FLANN_MATRIX_SIZE;k++){ + for (int l=0;l<FLANN_MATRIX_SIZE;l++){ + frametiledata[((k*FLANN_MATRIX_SIZE+l)*3)+(tilestep*(j*w+i))]=cptr[((i*FLANN_MATRIX_SIZE+k)*fw+kinexstart)-(j*FLANN_MATRIX_SIZE+l))*3]; + frametiledata[((k*FLANN_MATRIX_SIZE+l)*3)+(tilestep*(j*w+i))]=cptr[((i*FLANN_MATRIX_SIZE+k)*fw+kinexstart)-(j*FLANN_MATRIX_SIZE+l))*3]; + frametiledata[((k*FLANN_MATRIX_SIZE+l)*3)+(tilestep*(j*w+i))]=cptr[((i*FLANN_MATRIX_SIZE+k)*fw+kinexstart)-(j*FLANN_MATRIX_SIZE+l))*3]; + } + } + } + } + */ - //floatImage.allocate(w*FLANN_MATRIX_SIZE,h*FLANN_MATRIX_SIZE); - //floatImage=colourImage; - //floatImage.scaleIntoMe(colourImage); + //floatImage.allocate(w*FLANN_MATRIX_SIZE,h*FLANN_MATRIX_SIZE); + //floatImage=colourImage; + //floatImage.scaleIntoMe(colourImage); - // mark pixels and texture dirty - depthImage.flagImageChanged(); - //colourImage.flagImageChanged(); - //floatImage.flagImageChanged(); + // mark pixels and texture dirty + depthImage.flagImageChanged(); + //colourImage.flagImageChanged(); + //floatImage.flagImageChanged(); - /* - ofxCvColorImage *prevCol=&colourImage; - ofxCvGrayscaleImage *prevDepth=&depthImage; + /* + ofxCvColorImage *prevCol=&colourImage; + ofxCvGrayscaleImage *prevDepth=&depthImage; - for (int i=0;i<colourTiles.size();i++){ - colourTiles[i].scaleIntoMe(*prevCol); - depthTiles[i].scaleIntoMe(*prevDepth); - prevCol=&colourTiles[i]; - prevDepth=&depthTiles[i]; + for (int i=0;i<colourTiles.size();i++){ + colourTiles[i].scaleIntoMe(*prevCol); + depthTiles[i].scaleIntoMe(*prevDepth); + prevCol=&colourTiles[i]; + prevDepth=&depthTiles[i]; + + colourTiles[i].flagImageChanged(); + depthTiles[i].flagImageChanged(); + } + */ + } + break; + } - colourTiles[i].flagImageChanged(); - depthTiles[i].flagImageChanged(); - } - */ - } - store.update(); + + } @@ -154,9 +182,23 @@ void ofApp::draw() { ofSetColor(255, 255, 255); + screenleft.draw(0,0,(ofGetWidth()-ofGetHeight())/2,ofGetHeight()); + screenright.draw(ofGetWidth()-((ofGetWidth()-ofGetHeight())/2),0,(ofGetWidth()-ofGetHeight())/2,ofGetHeight()); + store.drawinstagram(ofGetWidth()-(((ofGetWidth()-ofGetHeight())/2)*0.8f),ofGetHeight()*0.44f,ofGetHeight()*0.24f,ofGetHeight()*0.24f); + + int fw,w,xstart,ystart,kinexstart; switch(mode){ + case MODE_DRAWINSTAGRAM: + if (!store.drawinstagram((ofGetWidth()/2)-(ofGetHeight()/2),0,ofGetHeight(),ofGetHeight())) { + mode=MODE_FROZEN; + store.instagram_floats(floatImage); + frozentime=ofGetElapsedTimef(); + } + break; + case MODE_FROZEN: + if (ofGetElapsedTimef()-frozentime>IMAGE_FREEZE_TIME) mode=MODE_COLOURTILES; case MODE_COLOURTILES: //store.draw(); xstart=(ofGetWidth()/2)-((depthImage.getHeight()/2)*MAX_TILE_SIZE); diff --git a/offsetProject/src/ofApp.h b/offsetProject/src/ofApp.h index e31c5b1..04d636c 100644 --- a/offsetProject/src/ofApp.h +++ b/offsetProject/src/ofApp.h @@ -9,6 +9,8 @@ #define MODE_COLOURTILES 0 #define MODE_DEPTH 1 #define MODE_COMPONENTS 2 +#define MODE_DRAWINSTAGRAM 3 +#define MODE_FROZEN 4 #define NUM_MODES 3 @@ -43,5 +45,9 @@ public: float* tiledata; float* frametiledata; + ofImage screenleft,screenright; + + float frozentime; + bool fullscreen; }; |
