From 825b01cad1cbba6bfc9a54ea2a18bd8a021e8c93 Mon Sep 17 00:00:00 2001 From: Wim Vriend Date: Mon, 7 Jun 2010 20:33:48 +0000 Subject: Improvements git-svn-id: svn+ssh://svn.code.sf.net/p/facetracknoir/code@7 19e81ba0-9b1a-49c3-bd6c-561e1906d5fb --- FaceTrackNoIR/FaceTrackNoIR.cpp | 2 +- FaceTrackNoIR/FaceTrackNoIR.ui | 184 +++++++++++++++++++++----------------- FaceTrackNoIR/Release/tracker.obj | Bin 279315 -> 288812 bytes FaceTrackNoIR/Release/vc90.idb | Bin 2550784 -> 2558976 bytes FaceTrackNoIR/Release/vc90.pdb | Bin 2134016 -> 2027520 bytes FaceTrackNoIR/tracker.cpp | 48 +++++++--- FaceTrackNoIR/tracker.h | 2 +- 7 files changed, 144 insertions(+), 92 deletions(-) (limited to 'FaceTrackNoIR') diff --git a/FaceTrackNoIR/FaceTrackNoIR.cpp b/FaceTrackNoIR/FaceTrackNoIR.cpp index 18a06ecc..19af030e 100644 --- a/FaceTrackNoIR/FaceTrackNoIR.cpp +++ b/FaceTrackNoIR/FaceTrackNoIR.cpp @@ -334,7 +334,7 @@ void FaceTrackNoIR::loadSettings() { ui.chkInvertX->setChecked (iniFile.value ( "invertX", 0 ).toBool()); ui.chkInvertY->setChecked (iniFile.value ( "invertY", 0 ).toBool()); ui.chkInvertZ->setChecked (iniFile.value ( "invertZ", 0 ).toBool()); - ui.chkUseEWMA->setChecked (iniFile.value ( "useEWMA", 0 ).toBool()); + ui.chkUseEWMA->setChecked (iniFile.value ( "useEWMA", 1 ).toBool()); ui.redYaw->setValue (iniFile.value ( "redYaw", 70 ).toInt()); ui.redPitch->setValue (iniFile.value ( "redPitch", 70 ).toInt()); ui.redRoll->setValue (iniFile.value ( "redRoll", 70 ).toInt()); diff --git a/FaceTrackNoIR/FaceTrackNoIR.ui b/FaceTrackNoIR/FaceTrackNoIR.ui index 7e3088a3..0cab62bc 100644 --- a/FaceTrackNoIR/FaceTrackNoIR.ui +++ b/FaceTrackNoIR/FaceTrackNoIR.ui @@ -940,11 +940,11 @@ color:#000; background:none; - Smoothing (samples) + Global settings - + @@ -972,7 +972,7 @@ background:none; - + @@ -988,6 +988,59 @@ background:none; + + + + + + + + + + + + 25 + 0 + + + + + 150 + 16777215 + + + + color:#ccc; +background:none; + + + Use EWMA filtering: + + + + + + + + 25 + 0 + + + + + 150 + 16777215 + + + + color:#ccc; +background:none; + + + Smoothing (samples): + + + @@ -997,13 +1050,13 @@ background:none; - 0 + 1 45 - 2 + 5 5 @@ -1027,43 +1080,16 @@ background:none; 45 - + 5 - - - - - - - 25 - 0 - - - - - 150 - 16777215 - - - - color:#ccc; -background:none; - - - Rotation Neutral Zone (degr.) - - - - - - - + + 5 - - + + 25 @@ -1081,7 +1107,7 @@ background:none; background:none; - Use EWMA filtering + Neutral Zone: @@ -2311,8 +2337,6 @@ background:none; spinSensZ slideSmoothing spinSmoothing - slideNeutralZone - spinNeutralZone headXLine headRotXLine headYLine @@ -2516,38 +2540,6 @@ background:none; - - slideNeutralZone - valueChanged(int) - spinNeutralZone - setValue(int) - - - 813 - 238 - - - 869 - 240 - - - - - spinNeutralZone - valueChanged(int) - slideNeutralZone - setValue(int) - - - 869 - 240 - - - 813 - 238 - - - slideSmoothing valueChanged(int) @@ -2555,12 +2547,12 @@ background:none; setValue(int) - 813 - 176 + 776 + 180 - 869 - 178 + 832 + 182 @@ -2571,12 +2563,12 @@ background:none; setValue(int) - 869 - 178 + 832 + 182 - 813 - 176 + 776 + 180 @@ -2772,5 +2764,37 @@ background:none; + + slideNeutralZone + valueChanged(int) + spinNeutralZone + setValue(int) + + + 701 + 233 + + + 800 + 242 + + + + + spinNeutralZone + valueChanged(int) + slideNeutralZone + setValue(int) + + + 806 + 232 + + + 741 + 231 + + + diff --git a/FaceTrackNoIR/Release/tracker.obj b/FaceTrackNoIR/Release/tracker.obj index 1feae14e..a50afb5f 100644 Binary files a/FaceTrackNoIR/Release/tracker.obj and b/FaceTrackNoIR/Release/tracker.obj differ diff --git a/FaceTrackNoIR/Release/vc90.idb b/FaceTrackNoIR/Release/vc90.idb index b3f2574f..fbbc4b50 100644 Binary files a/FaceTrackNoIR/Release/vc90.idb and b/FaceTrackNoIR/Release/vc90.idb differ diff --git a/FaceTrackNoIR/Release/vc90.pdb b/FaceTrackNoIR/Release/vc90.pdb index 432b1e6a..3bb5b6da 100644 Binary files a/FaceTrackNoIR/Release/vc90.pdb and b/FaceTrackNoIR/Release/vc90.pdb differ diff --git a/FaceTrackNoIR/tracker.cpp b/FaceTrackNoIR/tracker.cpp index fc4a8d20..be428fac 100644 --- a/FaceTrackNoIR/tracker.cpp +++ b/FaceTrackNoIR/tracker.cpp @@ -23,6 +23,8 @@ *********************************************************************************/ /* Modifications (last one on top): + 20100607 - WVR: Re-installed Rotation Neutral Zone and improved reaction + after 'start/stop'. MessageBeep when confidence is back... 20100604 - WVR: Created structure for DOF-data and changed timing of ReceiveHeadPose end run(). 20100602 - WVR: Implemented EWMA-filtering, according to the example of @@ -120,7 +122,7 @@ void Tracker::setup(QWidget *head, FaceTrackNoIR *parent) { registerHeadPoseCallback(); // some parameteres [optional] - smHTSetHeadPosePredictionEnabled( _engine->handle(), true); + smHTSetHeadPosePredictionEnabled( _engine->handle(), false); smHTSetLipTrackingEnabled( _engine->handle(), false); smLoggingSetFileOutputEnable( false ); @@ -221,10 +223,31 @@ void Tracker::run() { Tracker::do_tracking = !Tracker::do_tracking; // - // To start tracking again and be '0', execute Center command too + // To start tracking again and to be at '0', execute Center command too // if (Tracker::do_tracking) { Tracker::do_center = true; + + Tracker::set_initial = false; + Tracker::confid = false; + + Pitch.rawList.clear(); + Pitch.prevPos = 0.0f; + Yaw.rawList.clear(); + Yaw.prevPos = 0.0f; + Roll.rawList.clear(); + Roll.prevPos = 0.0f; + X.rawList.clear(); + X.prevPos = 0.0f; + Y.rawList.clear(); + Y.prevPos = 0.0f; + Z.rawList.clear(); + Z.prevPos = 0.0f; + + _engine->start(); + } + else { + _engine->stop(); } qDebug() << "Tracker::run() says BACK pressed, do_tracking =" << Tracker::do_tracking; } @@ -248,6 +271,7 @@ void Tracker::run() { // if(Tracker::set_initial == false) { Tracker::Z.initial_headPos = Tracker::getHeadPosZ(); + MessageBeep (MB_ICONASTERISK); Tracker::set_initial = true; } @@ -276,7 +300,7 @@ void Tracker::run() { // // If Center is pressed, copy the current values to the offsets. // - if (Tracker::do_center) { + if (Tracker::do_center && Tracker::set_initial) { Pitch.offset_headPos = getSmoothFromList( &Pitch.rawList ); Yaw.offset_headPos = getSmoothFromList( &Yaw.rawList ); Roll.offset_headPos = getSmoothFromList( &Roll.rawList ); @@ -290,7 +314,7 @@ void Tracker::run() { Tracker::do_center = false; } - if (Tracker::do_tracking) { + if (Tracker::do_tracking && Tracker::confid) { // // Also send the Virtual Pose to FT-server and FG-server // @@ -388,28 +412,31 @@ void Tracker::receiveHeadPose(void *,smEngineHeadPoseData head_pose, smCameraVid // // Pitch if (Tracker::useFilter) { - Pitch.newPos = lowPassFilter ( Tracker::Pitch.headPos, &Pitch.prevPos, dT, Tracker::Pitch.red ); + Pitch.newPos = lowPassFilter ( getCorrectedNewRaw ( Tracker::Pitch.headPos, rotNeutralZone ), + &Pitch.prevPos, dT, Tracker::Pitch.red ); } else { - Pitch.newPos = Tracker::Pitch.headPos; + Pitch.newPos = getCorrectedNewRaw ( Tracker::Pitch.headPos, rotNeutralZone ); } addRaw2List ( &Pitch.rawList, Pitch.maxItems, Pitch.newPos ); // Yaw if (Tracker::useFilter) { - Yaw.newPos = lowPassFilter ( Tracker::Yaw.headPos, &Yaw.prevPos, dT, Tracker::Yaw.red ); + Yaw.newPos = lowPassFilter ( getCorrectedNewRaw ( Tracker::Yaw.headPos, rotNeutralZone ), + &Yaw.prevPos, dT, Tracker::Yaw.red ); } else { - Yaw.newPos = Tracker::Yaw.headPos; + Yaw.newPos = getCorrectedNewRaw ( Tracker::Yaw.headPos, rotNeutralZone ); } addRaw2List ( &Yaw.rawList, Yaw.maxItems, Yaw.newPos ); // Roll if (Tracker::useFilter) { - Roll.newPos = lowPassFilter ( Tracker::Roll.headPos, &Roll.prevPos, dT, Tracker::Roll.red ); + Roll.newPos = lowPassFilter ( getCorrectedNewRaw (Tracker::Roll.headPos, rotNeutralZone ), + &Roll.prevPos, dT, Tracker::Roll.red ); } else { - Roll.newPos = Tracker::Roll.headPos; + Roll.newPos = getCorrectedNewRaw (Tracker::Roll.headPos, rotNeutralZone ); } addRaw2List ( &Roll.rawList, Roll.maxItems, Roll.newPos ); @@ -474,6 +501,7 @@ bool Tracker::handleGameCommand ( int command ) { case 1: // reset headtracker if ( _engine ) { _engine->stop(); + Tracker::set_initial = false; _engine->start(); } break; diff --git a/FaceTrackNoIR/tracker.h b/FaceTrackNoIR/tracker.h index 9cf89114..dcb075f6 100644 --- a/FaceTrackNoIR/tracker.h +++ b/FaceTrackNoIR/tracker.h @@ -81,6 +81,7 @@ private: static void STDCALL receiveHeadPose(void *,smEngineHeadPoseData head_pose, smCameraVideoFrame video_frame); static void addRaw2List ( QList *rawList, float maxIndex, float raw ); static float lowPassFilter ( float newvalue, float *oldvalue, float dt, float coeff); + static float getCorrectedNewRaw ( float NewRaw, float rotNeutral ); /** static member variables for saving the head pose **/ static THeadPoseDOF Pitch; // Head-rotation X-direction (Up/Down) @@ -175,7 +176,6 @@ public: static void setNeutralZone(int x) { rotNeutralZone = (x * 2.0f * 3.14159)/360.0f; } float getSmoothFromList ( QList *rawList ); - float getCorrectedNewRaw ( float NewRaw, float rotNeutral ); float getDegreesFromRads ( float rads ) { return ((rads * 360.0f)/ (2.0f * 3.14159)); } // For now, use one slider for all -- cgit v1.2.3