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