diff --git a/FaceTrackerTest.vcxproj b/FaceTrackerTest.vcxproj index 04f377c..35ff651 100644 --- a/FaceTrackerTest.vcxproj +++ b/FaceTrackerTest.vcxproj @@ -122,11 +122,13 @@ if not exist "$(ProjectDir)\bin\data" mkdir "$(ProjectDir)\bin\data" + + diff --git a/FaceTrackerTest.vcxproj.user b/FaceTrackerTest.vcxproj.user index 4fd69e1..5676366 100644 --- a/FaceTrackerTest.vcxproj.user +++ b/FaceTrackerTest.vcxproj.user @@ -4,4 +4,8 @@ $(ProjectDir)\bin WindowsLocalDebugger + + $(ProjectDir)\bin + WindowsLocalDebugger + \ No newline at end of file diff --git a/src/FaceTracker.cpp b/src/FaceTracker.cpp index fcd1757..47f0281 100644 --- a/src/FaceTracker.cpp +++ b/src/FaceTracker.cpp @@ -1,10 +1,11 @@ #include "FaceTracker.h" -//#include + +#include #define LOST_TICKS 300 -//using namespace std; -//using namespace arma; +using namespace std; +using namespace arma; FaceTracker::FaceTracker(void) { @@ -16,38 +17,13 @@ FaceTracker::~FaceTracker(void) { } -// TRACK METHOD -// -// New face appears One face disappear -// -// finder j - [1] [2] [3] : [1] [2] - ah height of matrix -// | X | / : | X | \ -// faces i - (1) (2) : (1) (2) (3) - aw width of matrix -// -// Building of distance (dst) matrix, # - shortest -// dst (*)>[*] dst [*]>(*) -// -// (0) (1) i : (0) (1) (2) i -// [0]| # | | : [0]| # | | | -// [1]| | # | : [1]| | # | | -// [2]| | | : j -// j -// nw = true nw = false -// sid = [0, 1] sid = [0, 1] -// lid = [0, 1,-1] lid = [0, 1,-1] -// lost face or blob = -1 - -void FaceTracker::trackFaces(vector& blobs) { - - string dbg = debug = ""; - //cout << ("\n\n---------------------------------\n"); +void FaceTracker::trackFaces(vector& blobs) { + int aw = blobs.size(); int ah = trackedFaces.size(); - - dbg = "dst["+ofToString(aw)+"x"+ofToString(ah)+"]\n"; - //cout << dbg; - debug += dbg; + + mat D(aw, ah); // if aw > ah int sc = min(aw, ah); // short side counter @@ -55,35 +31,23 @@ void FaceTracker::trackFaces(vector& blobs) { bool nw = aw > ah; // true - number of detected faces greater than tracked faces // Allocate memory - float** dst; dst = new float* [ah]; for (int i = 0; i < ah; ++i) dst[i] = new float[aw]; - float* min = new float[ah]; for (int i = 0; i < ah; ++i) min[i] = 1e8; - // if nw lid - mean blob to face link else face to blob - int* sid = new int [sc]; for (int i = 0; i < sc; ++i) sid[i] = -1; // link id - int* lid = new int [lc]; for (int i = 0; i < lc; ++i) lid[i] = -1; // back reference id, has holes for(int j = 0; j < ah; j++) { - dbg ="["; for(int i = 0; i < aw; i++) { ofRectangle& r1 = trackedFaces[j]; ofRectangle& r2 = blobs[i]; - float dcx = r2.x+r2.width /2.0 - r1.x-r1.width /2.0; - float dcy = r2.y+r2.height/2.0 - r1.y-r1.height/2.0; - dst[j][i] = sqrt(dcx*dcx + dcy*dcy); - int c = nw ? j : i; // shortest side counter - int r = nw ? i : j; // reference to longer side counter - if(dst[j][i] < min[c]) { - min[c] = dst[j][i]; - sid[c] = r; - } - dbg += ofToString(dst[j][i])+string((i& blobs) { //trackedFaces[sid[i]].setNewRect(blobs[i]); } } - dbg="lid["; for (int i=0; i& blobs) { } // De-Allocate memory to prevent memory leak - delete[] lid; - delete[] sid; - delete[] min; for (int i = 0; i < ah; ++i) delete [] dst[i]; delete[] dst; }; \ No newline at end of file diff --git a/src/FaceTracker.h b/src/FaceTracker.h index 83ae364..5abcfa2 100644 --- a/src/FaceTracker.h +++ b/src/FaceTracker.h @@ -1,6 +1,7 @@ #pragma once #include "ofMain.h" +#include "Face.h" class FaceTracker { @@ -8,9 +9,9 @@ class FaceTracker FaceTracker(void); ~FaceTracker(void); - vector trackedFaces; - int trackedFacesCounter[100]; - void trackFaces(vector& blobs); + vector faces; + + void trackFaces(vector& blobs); string debug; diff --git a/tests/FaceTrackerTest/main.cpp b/tests/FaceTrackerTest/main.cpp index 312c54e..db10c62 100644 --- a/tests/FaceTrackerTest/main.cpp +++ b/tests/FaceTrackerTest/main.cpp @@ -6,7 +6,7 @@ int main( ){ ofAppGlutWindow window; - ofSetupOpenGL(&window, 800,600, OF_WINDOW); // <-------- setup the GL context + ofSetupOpenGL(&window, 1920,1080, OF_WINDOW); // <-------- setup the GL context // this kicks off the running of my app // can be OF_WINDOW or OF_FULLSCREEN diff --git a/tests/FaceTrackerTest/testApp.cpp b/tests/FaceTrackerTest/testApp.cpp index 2f6cb8a..69bcc99 100644 --- a/tests/FaceTrackerTest/testApp.cpp +++ b/tests/FaceTrackerTest/testApp.cpp @@ -13,21 +13,20 @@ unsigned char testApp::colors[] = { //-------------------------------------------------------------- void testApp::setup(){ + + oclx1 = ofGetWidth()* 4/16; + oclx2 = ofGetWidth()*11/16; + oclw = ofGetWidth() /16; ofBackground(0); ofEnableAlphaBlending(); - ofSetCircleResolution(4); + ofSetCircleResolution(36); - bg.allocate(ofGetWidth(), ofGetHeight(), OF_IMAGE_COLOR); - unsigned char* pixels = bg.getPixels(); - memset(pixels, 0x0, bg.width*bg.height*3); - //ofSetFrameRate(300); } //-------------------------------------------------------------- void testApp::update(){ - - unsigned char* pixels = bg.getPixels(); + if(!B.size() || (B.size() < 10 && ofRandom(0.0, 100.0) > 99.0)) { @@ -46,6 +45,7 @@ void testApp::update(){ C.push_back(ofColor(colors[c*3], colors[c*3+1], colors[c*3+2])); } + // random kill first if(B.size() >= 5 && ofRandom(0.0, 100.0) > 99.0) { B.erase(B.begin()); T.erase(T.begin()); @@ -58,39 +58,31 @@ void testApp::update(){ float dy = B[i].y + B[i].height/2 - T[i].y; float ln = sqrt(dx*dx + dy*dy); - float v = 1.0; + float v = 20.0; - V[i].x += (-dx/ln*v- V[i].x)/25; - V[i].y += (-dy/ln*v- V[i].y)/25; + V[i].x += (-dx/ln*v- V[i].x)/50; + V[i].y += (-dy/ln*v- V[i].y)/50; B[i] = B[i]+V[i]; - // T[i].x +=dy/ln/ln*1e2; - // T[i].y -=dx/ln/ln*1e2; - T[i].x +=dy/ln*v/2.0; - T[i].y -=dx/ln*v/2.0; + T[i].x +=dy/ln/ln*1e2*v; + T[i].y -=dx/ln/ln*1e2*v; + //T[i].x +=dy/ln*v; + //T[i].y -=dx/ln*v; - // ofPoint c = B[i].getCenter(); - // for (int j=0; j0 && x0 && y 99.5) T[i] = ofPoint( ofRandom(ofGetWidth()), ofRandom(ofGetHeight())); } - bg.update(); - vector b = B; + vector b; + // occlude blobs + for (int i=0; i< B.size(); i++) { + float x = B[i].getCenter().x; + if((xoclx1+oclw) && (xoclx2+oclw)) { + b.push_back(B[i]); + } + } + random_shuffle(b.begin(), b.end()); tracker.trackFaces(b); @@ -99,10 +91,7 @@ void testApp::update(){ //-------------------------------------------------------------- void testApp::draw() { - ofSetColor(255); - bg.draw(0,0); - //fl.draw(0,0); - + ofNoFill(); for (int i=0; i