diff options
| author | Tim Redfern <tim@eclectronics.org> | 2012-03-31 16:44:02 +0100 |
|---|---|---|
| committer | Tim Redfern <tim@eclectronics.org> | 2012-03-31 16:44:02 +0100 |
| commit | 0e8f0361c1068eb4c2f634dfcf4e1762d87f40d2 (patch) | |
| tree | 96a4eb154c1ac2dbe5ad4e04d4e33b281832e441 /gaunt01/src/testApp.cpp | |
| parent | 623e1924aeea83ea70c8ae7f645b067f17a293ea (diff) | |
implementing trap door
Diffstat (limited to 'gaunt01/src/testApp.cpp')
| -rw-r--r-- | gaunt01/src/testApp.cpp | 150 |
1 files changed, 107 insertions, 43 deletions
diff --git a/gaunt01/src/testApp.cpp b/gaunt01/src/testApp.cpp index 00658b4..1ab413b 100644 --- a/gaunt01/src/testApp.cpp +++ b/gaunt01/src/testApp.cpp @@ -1,23 +1,28 @@ #include "testApp.h" //-------------------------------------------------------------- +//units ~ 10cm +// void testApp::setup(){ + + bLearnBakground = true; + cam_angle=0; + threshold = 80; + + loadSettings("settings.xml"); #ifdef _USE_LIVE_VIDEO vidGrabber.setVerbose(true); vidGrabber.initGrabber(320,240); #else - vidPlayer.loadMovie("camoutput.mov"); + vidPlayer.loadMovie("camoutput.wmv"); //footage/ camera needs to be the same res as opencv planes and output vidPlayer.play(); #endif - colorImg.allocate(320,240); - grayImage.allocate(320,240); - grayBg.allocate(320,240); - grayDiff.allocate(320,240); - - bLearnBakground = true; - threshold = 80; + colorImg.allocate(640,480); + grayImage.allocate(640,480); + grayBg.allocate(640,480); + grayDiff.allocate(640,480); ofVec3f centre=ofVec3f(ofGetWidth()/2,0,0); ofVec3f normal=ofVec3f(0,0,-1); @@ -25,16 +30,17 @@ void testApp::setup(){ plane=ofPlane(centre,normal); plane.color=ofColor(255,255,255); - projector=ofProjector(1.535f, ofVec2f(0.0f, 0.5f),ofGetWidth(),ofGetHeight()); - projector.setPosition(ofGetWidth()/2,ofGetHeight()/2,ofGetHeight()); + projector=ofProjector(2.0f, ofVec2f(0.0f, 0.0f),ofGetWidth(),ofGetHeight()); //1.535f + projector.setPosition(ofGetWidth()/2,ofGetHeight()/2,-ofGetWidth()); + projector.lookAt(ofVec3f(ofGetWidth()/2,ofGetHeight()/2,0),ofVec3f(0, -1, 0)); cam=ofCamera(); - cam.setPosition(ofGetWidth()/2,ofGetHeight()/2,ofGetHeight()); - cam.lookAt(ofVec3f(ofGetWidth()/2,ofGetHeight()/2,0)); - cam.setFov(54.13); - - cam_angle=0; - + cam.setPosition(ofGetWidth()/2,ofGetHeight()/2,-ofGetWidth()); + cam.lookAt(ofVec3f(ofGetWidth()/2,ofGetHeight()/2,0),ofVec3f(0, -1, 0)); + cam.setFov(42.0); //39.85); //53.13); + + trapDoor=trapdoor(ofRectangle(0,0,ofGetWidth(),ofGetHeight()),ofVec2f(20,20)); + } //-------------------------------------------------------------- @@ -56,7 +62,7 @@ void testApp::update(){ #ifdef _USE_LIVE_VIDEO colorImg.setFromPixels(vidGrabber.getPixels(), 320,240); #else - colorImg.setFromPixels(vidPlayer.getPixels(), 320,240); + colorImg.setFromPixels(vidPlayer.getPixels(), 640,480); #endif grayImage = colorImg; @@ -71,7 +77,9 @@ void testApp::update(){ // find contours which are between the size of 20 pixels and 1/3 the w*h pixels. // also, find holes is set to true so we will get interior contours as well.... - contourFinder.findContours(grayDiff, 20, (340*240)/3, 10, false); // don't find holes + + //hard coded size threshold of 100 pix + contourFinder.findContours(grayDiff, 200, (640*480)/3, 20, false); // don't find holes } } @@ -96,6 +104,8 @@ void testApp::draw(){ // we could draw the whole contour finder //contourFinder.draw(360,540); + + //keep running background average- how do you use a custom background colorImg.draw(0,0,ofGetWidth(),ofGetHeight()); @@ -117,27 +127,65 @@ void testApp::draw(){ } ofPopMatrix(); - cam.end(); - - ofSphere(pos.x,pos.y,pos.z,5); - - for (int i = 0; i < contourFinder.nBlobs; i++){ + + + //ofSphere(pos.x,pos.y,pos.z,5); + + vector<ofVec3f> newPlayers; + float movethresh=10; + + for (int i = 0; i < contourFinder.nBlobs; i++){ + //do some bounds checking, size threshold and overlap removal + //in order to translate blobs into players + //attempt to track players - maintain ID no + //attempt to base blobs + //TODO attempt to estimate bounds shape + //project all of this into the 3D space + ofRectangle r=contourFinder.blobs[i].boundingRect; + + ofVec2f blobBase=ofVec2f(r.x+(r.width/2),r.y+r.height-(r.width/2)); + contourFinder.blobs[i].draw(0,0); - ofPoint p=contourFinder.blobs[i].centroid; - ofVec3f pp; - cam.begin(); - ofPushMatrix(); - - ofRotate(cam_angle,1,0,0); - ray=projector.castPixel(p.x,(ofGetHeight()/2)-p.y); //(ofGetHeight()-y)); - bool hit = plane.intersect(ray,pp); - ofBox(pp,50); - ofPopMatrix(); - cam.end(); + ofSetHexColor(0xffff00); + + char numStr[16]; + sprintf(numStr, "%i", i); + ofDrawBitmapString(numStr, r.x, r.y); + + ofVec3f pp; + ray=projector.castPixel(blobBase.x,blobBase.y); //(ofGetHeight()-y)); + bool hit = plane.intersect(ray,pp); + + + for (int i=0;i<players.size();i++) { + if (abs(players[i].x-pp.x)<10&&abs(players[i].z-pp.z)) { + //identified a player + //this is flawed: tracking boxes in a skewed axis + //how to get UV coords on the plane + //maybe rotate the camera instead of the plane + + } + } + + ofPushMatrix(); + ofTranslate(pp); + ofRotate(cam_angle,1,0,0); + ofBox(0,-10,0,20); + //for now, draw in this axis + ofPopMatrix(); - } + } + + trapDoor.checkUpdate(players); + ofPushMatrix(); + ofRotate(cam_angle,1,0,0); + //for now, draw in this axis + trapDoor.draw(); + ofPopMatrix(); + + cam.end(); @@ -146,10 +194,7 @@ void testApp::draw(){ ofSetHexColor(0xffffff); char reportStr[1024]; sprintf(reportStr, "threshold %i\nnum blobs found %i, fps: %f", threshold, contourFinder.nBlobs, ofGetFrameRate()); - ofDrawBitmapString(reportStr, 10, 215); - - - + ofDrawBitmapString(reportStr, 10, ofGetHeight()-40); } //-------------------------------------------------------------- @@ -167,12 +212,15 @@ void testApp::keyPressed(int key){ threshold --; if (threshold < 0) threshold = 0; break; - case 'a': + case 'a': cam_angle+=1; break; - case 'z': + case 'z': cam_angle-=1; break; + case 's': + saveSettings("settings.xml"); + break; } plane.setNormal(ofVec3f(0,sin(cam_angle*0.01745329),-cos(cam_angle*0.01745329))); } @@ -199,13 +247,12 @@ void testApp::mousePressed(int x, int y, int button){ //-------------------------------------------------------------- void testApp::mouseReleased(int x, int y, int button){ - ray=projector.castPixel(x,((3*(ofGetHeight()/2))-y)); //(ofGetHeight()-y)); + ray=projector.castPixel(x,y); //+(ofGetHeight()/2)); //(ofGetHeight()-y)); bool hit = plane.intersect(ray,pos); //pos=ofVec3f(pos.x*2,pos.y*2,pos.z*2); if (hit) printf("ray:%i,%i hit plane:%f,%f,%f\n",x,y,pos.x,pos.y,pos.z); else printf("ray:%i,%i missed plane\n",x,y); - } //-------------------------------------------------------------- @@ -222,3 +269,20 @@ void testApp::gotMessage(ofMessage msg){ void testApp::dragEvent(ofDragInfo dragInfo){ } + +void testApp::loadSettings(string filename){ + if( !XML.loadFile(filename) ){ + printf("unable to load %s check data/ folder\n",filename.c_str()); + }else{ + cam_angle=ofToInt(XML.getAttribute("gauntlet","cam_angle","none",0)); + threshold=ofToInt(XML.getAttribute("gauntlet","threshold","none",0)); + printf("loaded %s\n",filename.c_str()); + } +} +//-------------------------------------------------------------- +void testApp::saveSettings(string filename){ + XML.setAttribute("gauntlet","cam_angle",ofToString(cam_angle),0); + XML.setAttribute("gauntlet","threshold",ofToString(threshold),0); + XML.saveFile(filename); + printf("saved %s\n",filename.c_str()); +} |
