summaryrefslogtreecommitdiff
path: root/offsetProject
diff options
context:
space:
mode:
authorTim Redfern <tim@eclectronics.org>2014-03-14 14:07:28 +0000
committerTim Redfern <tim@eclectronics.org>2014-03-14 14:07:28 +0000
commitbcf4c0ac5428a1c3f331d66cf0c4a301d1f7a45f (patch)
treeef4011c68ae756815aa47da218029801e9c56ec6 /offsetProject
parentbb852cee91b52b71fccade7d4a1ef065eb0de2f0 (diff)
nearly ready
Diffstat (limited to 'offsetProject')
-rw-r--r--offsetProject/bin/data/screenleft.pngbin0 -> 17594 bytes
-rw-r--r--offsetProject/bin/data/screenright.pngbin0 -> 9734 bytes
-rw-r--r--offsetProject/src/buttonChecker.cpp8
-rw-r--r--offsetProject/src/buttonChecker.h72
-rw-r--r--offsetProject/src/imageStore.h87
-rw-r--r--offsetProject/src/ofApp.cpp168
-rw-r--r--offsetProject/src/ofApp.h6
7 files changed, 274 insertions, 67 deletions
diff --git a/offsetProject/bin/data/screenleft.png b/offsetProject/bin/data/screenleft.png
new file mode 100644
index 0000000..eca31d1
--- /dev/null
+++ b/offsetProject/bin/data/screenleft.png
Binary files differ
diff --git a/offsetProject/bin/data/screenright.png b/offsetProject/bin/data/screenright.png
new file mode 100644
index 0000000..6fe6bad
--- /dev/null
+++ b/offsetProject/bin/data/screenright.png
Binary files differ
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;
};