summaryrefslogtreecommitdiffhomepage
path: root/FTNoIR_Tracker_SM
diff options
context:
space:
mode:
authorWim Vriend <facetracknoir@gmail.com>2011-03-22 09:08:56 +0000
committerWim Vriend <facetracknoir@gmail.com>2011-03-22 09:08:56 +0000
commitbe57b6b8d3f8339980df08f196d23415f7974418 (patch)
treef77ed10035c76e6f3e617253bee09c99bb03e25d /FTNoIR_Tracker_SM
parent7eeb8dfaede7bb54b37b8ea538135914a43ab011 (diff)
First success merging 3.2.6
git-svn-id: svn+ssh://svn.code.sf.net/p/facetracknoir/code@55 19e81ba0-9b1a-49c3-bd6c-561e1906d5fb
Diffstat (limited to 'FTNoIR_Tracker_SM')
-rw-r--r--FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h29
-rw-r--r--FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj95
-rw-r--r--FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp194
3 files changed, 152 insertions, 166 deletions
diff --git a/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h
index 9af25800..5bed0a16 100644
--- a/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h
+++ b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h
@@ -1,18 +1,14 @@
#include "..\ftnoir_tracker_base\ftnoir_tracker_base.h"
+#include "..\ftnoir_tracker_base\ftnoir_tracker_sm_types.h"
#include "ui_FTNoIR_SMClientcontrols.h"
-#include "mainwindow.h"
-#include "sm_api_qt.h"
#include <QMessageBox>
#include <QSettings>
+#include <QProcess>
#include "Windows.h"
#include "math.h"
using namespace std;
-//using namespace sm::faceapi::samplecode;
-using namespace sm::faceapi;
-using namespace sm::faceapi::qt;
-using namespace sm::faceapi::samplecode;
class FTNoIR_Tracker_SM : public ITracker
{
@@ -26,17 +22,28 @@ public:
void StopTracker();
bool GiveHeadPoseData(THeadPoseData *data); // Returns true if confidence is good
void loadSettings();
+ bool SMCreateMapping();
bool setParameterValue(const int index, const float newvalue);
private:
/** face api variables **/
- APIScope *faceapi_scope;
- QSharedPointer<EngineBase> _engine;
- VideoDisplayWidget *_display;
- QVBoxLayout *l;
- MainWindow *main_window;
+ //APIScope *faceapi_scope;
+ // QSharedPointer<EngineBase> _engine;
+ //VideoDisplayWidget *_display;
+ //QVBoxLayout *l;
+ //MainWindow *main_window;
//parameter list for the filter-function(s)
+
+ //
+ // global variables
+ //
+ HANDLE hSMMemMap;
+ SMMemMap *pMemData;
+ HANDLE hSMMutex;
+// smEngineHeadPoseData new_head_pose;
+ QProcess *faceAPI;
+
enum
{
kPortAddress=0, // Index in QList
diff --git a/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj
index b15c259b..9964af61 100644
--- a/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj
+++ b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj
@@ -171,10 +171,6 @@
RelativePath=".\ftnoir_tracker_faceapi.cpp"
>
</File>
- <File
- RelativePath=".\mainwindow.cpp"
- >
- </File>
</Filter>
<Filter
Name="Header Files"
@@ -207,64 +203,12 @@
/>
</FileConfiguration>
</File>
- <File
- RelativePath=".\mainwindow.h"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Moc&apos;ing $(InputFileName)..."
- CommandLine="&quot;$(QTDIR)\bin\moc.exe&quot; &quot;$(InputPath)&quot; -o &quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot; -D_WINDLL -DFTNOIR_TRACKER_BASE_LIB -DNDEBUG -DQT_CORE_LIB -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DUNICODE -DWIN32 -I&quot;$(QTDIR)\include\.&quot; -I&quot;$(QTDIR)\include\QtCore\.&quot; -I&quot;$(QTDIR)\include\QtGui\.&quot; -I&quot;$(QTDIR)\include\qtmain\.&quot; -I&quot;$(QTDIR)\include\QtNetwork\.&quot; -I&quot;$(SM_API_CPP_WRAPPERS)\include\.&quot; -I&quot;$(SM_API_PATH)\include\.&quot; -I&quot;$(SM_API_QTDIR)\include\.&quot; -I&quot;$(SM_API_WIDGETS)\include\.&quot; -I&quot;.\.&quot; -I&quot;.\GeneratedFiles\$(ConfigurationName)\.&quot; -I&quot;.\GeneratedFiles\.&quot;&#x0D;&#x0A;"
- AdditionalDependencies="&quot;$(QTDIR)\bin\moc.exe&quot;;$(InputPath)"
- Outputs="&quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot;"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Moc&apos;ing $(InputFileName)..."
- CommandLine="&quot;$(QTDIR)\bin\moc.exe&quot; &quot;$(InputPath)&quot; -o &quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot; -D_WINDLL -DFTNOIR_TRACKER_SM_LIB -DQT_CORE_LIB -DQT_LARGEFILE_SUPPORT -DQT_THREAD_SUPPORT -DUNICODE -DWIN32 -I&quot;$(QTDIR)\include\.&quot; -I&quot;$(QTDIR)\include\QtCore\.&quot; -I&quot;$(QTDIR)\include\qtmain\.&quot; -I&quot;.\.&quot; -I&quot;.\GeneratedFiles\$(ConfigurationName)\.&quot; -I&quot;.\GeneratedFiles\.&quot;&#x0D;&#x0A;"
- AdditionalDependencies="&quot;$(QTDIR)\bin\moc.exe&quot;;$(InputPath)"
- Outputs="&quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot;"
- />
- </FileConfiguration>
- </File>
</Filter>
<Filter
Name="Form Files"
Filter="ui"
UniqueIdentifier="{99349809-55BA-4b9d-BF79-8FDBB0286EB3}"
>
- <File
- RelativePath=".\mainwindow.ui"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Uic&apos;ing $(InputFileName)..."
- CommandLine="&quot;$(QTDIR)\bin\uic.exe&quot; -o &quot;.\GeneratedFiles\ui_$(InputName).h&quot; &quot;$(InputPath)&quot;&#x0D;&#x0A;"
- AdditionalDependencies="$(QTDIR)\bin\uic.exe"
- Outputs="&quot;.\GeneratedFiles\ui_$(InputName).h&quot;"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Uic&apos;ing $(InputFileName)..."
- CommandLine="&quot;$(QTDIR)\bin\uic.exe&quot; -o &quot;.\GeneratedFiles\ui_$(InputName).h&quot; &quot;$(InputPath)&quot;&#x0D;&#x0A;"
- AdditionalDependencies="$(QTDIR)\bin\uic.exe"
- Outputs="&quot;.\GeneratedFiles\ui_$(InputName).h&quot;"
- />
- </FileConfiguration>
- </File>
</Filter>
<Filter
Name="Resource Files"
@@ -279,56 +223,17 @@
UniqueIdentifier="{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}"
SourceControlFiles="false"
>
- <File
- RelativePath=".\GeneratedFiles\ui_mainwindow.h"
- >
- </File>
<Filter
Name="Release"
Filter="cpp;moc"
SourceControlFiles="false"
>
- <File
- RelativePath=".\GeneratedFiles\release\moc_mainwindow.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- />
- </FileConfiguration>
- </File>
</Filter>
<Filter
Name="Debug"
Filter="cpp;moc"
SourceControlFiles="false"
>
- <File
- RelativePath=".\GeneratedFiles\Debug\moc_mainwindow.cpp"
- >
- <FileConfiguration
- Name="Release|Win32"
- ExcludedFromBuild="true"
- >
- <Tool
- Name="VCCLCompilerTool"
- ObjectFile="$(IntDir)\$(InputName)1.obj"
- XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- ObjectFile="$(IntDir)\$(InputName)1.obj"
- XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
- />
- </FileConfiguration>
- </File>
</Filter>
</Filter>
</Files>
diff --git a/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp b/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp
index f2f18877..a7f0668e 100644
--- a/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp
+++ b/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp
@@ -1,10 +1,5 @@
#include "ftnoir_tracker_sm.h"
-#include "mainwindow.h"
-
-using namespace sm::faceapi;
-using namespace sm::faceapi::qt;
-using namespace sm::faceapi::samplecode;
-//using namespace sm::faceapi::qt;
+#include <QtGui>
FTNoIR_Tracker_SM::FTNoIR_Tracker_SM()
{
@@ -21,19 +16,18 @@ FTNoIR_Tracker_SM::FTNoIR_Tracker_SM()
FTNoIR_Tracker_SM::~FTNoIR_Tracker_SM()
{
qDebug() << "stopTracker says: terminating";
- //if ( _display ) {
- // _display->disconnect();
- // qDebug() << "stopTracker says: display disconnected";
- // delete _display;
- // qDebug() << "stopTracker says: display deleted";
- // _display = 0;
- // delete l;
- // l = 0;
- // qDebug() << "stopTracker says: l deleted";
- //}
- _engine->stop();
- smAPIQuit();
+ if ( pMemData != NULL ) {
+ pMemData->command = 100; // Issue 'stop' command
+ UnmapViewOfFile ( pMemData );
+ }
+
+ CloseHandle( hSMMutex );
+ CloseHandle( hSMMemMap );
+ hSMMemMap = 0;
+
+ //_engine->stop();
+ //smAPIQuit();
}
void FTNoIR_Tracker_SM::Release()
@@ -47,38 +41,52 @@ void FTNoIR_Tracker_SM::Initialize( QFrame *videoframe )
qDebug() << "FTNoIR_Tracker_SM::Initialize says: Starting ";
loadSettings();
- try {
- // Initialize the faceAPI Qt library
- sm::faceapi::qt::initialize();
- smLoggingSetFileOutputEnable( false );
+ if (SMCreateMapping()) {
+ qDebug() << "FTNoIR_Tracker_SM::Initialize Mapping created.";
+ }
+ else {
+ QMessageBox::warning(0,"FaceTrackNoIR Error","Memory mapping not created!",QMessageBox::Ok,QMessageBox::NoButton);
+ }
- // Initialize the API
- faceapi_scope = new APIScope();
+ //
+ // Start FTNoIR_FaceAPI_EXE.exe. The exe contains all faceAPI-stuff and is non-Qt...
+ //
+ QString program = "FTNoIR_FaceAPI_EXE.exe";
+ faceAPI = new QProcess(0);
+ faceAPI->start(program);
- //if (APIScope::internalQtGuiIsDisabled()){
- // QMessageBox::warning(0,"faceAPI Error","Something Bad",QMessageBox::Ok,QMessageBox::NoButton);
- //}
+ ////try {
+ //// // Initialize the faceAPI Qt library
+ //// sm::faceapi::qt::initialize();
+ //// smLoggingSetFileOutputEnable( false );
- // Create head-tracking engine v2 using first detected webcam
- CameraInfo::registerType(SM_API_CAMERA_TYPE_WDM);
- _engine = QSharedPointer<HeadTrackerV2>(new HeadTrackerV2());
+ //// // Initialize the API
+ //// faceapi_scope = new APIScope();
- }
- catch (sm::faceapi::Error &e)
- {
- /* ERROR with camera */
- QMessageBox::warning(0,"faceAPI Error",e.what(),QMessageBox::Ok,QMessageBox::NoButton);
- }
+ //// //if (APIScope::internalQtGuiIsDisabled()){
+ //// // QMessageBox::warning(0,"faceAPI Error","Something Bad",QMessageBox::Ok,QMessageBox::NoButton);
+ //// //}
+
+ //// // Create head-tracking engine v2 using first detected webcam
+ //// CameraInfo::registerType(SM_API_CAMERA_TYPE_WDM);
+ //// _engine = QSharedPointer<HeadTrackerV2>(new HeadTrackerV2());
+
+ ////}
+ ////catch (sm::faceapi::Error &e)
+ ////{
+ //// /* ERROR with camera */
+ //// QMessageBox::warning(0,"faceAPI Error",e.what(),QMessageBox::Ok,QMessageBox::NoButton);
+ ////}
// Show the video widget
qDebug() << "FTNoIR_Tracker_SM::Initialize says: videoframe = " << videoframe;
- // QMainWindow derived class. See mainwindow.h
- QSharedPointer<CameraBase> camera;
- main_window = new MainWindow(camera,_engine,0);
- main_window->show();
+ //// QMainWindow derived class. See mainwindow.h
+ // QSharedPointer<CameraBase> camera;
+ // main_window = new MainWindow(camera,_engine,0);
+ // main_window->show();
//videoframe->show();
//_display = new VideoDisplayWidget( _engine, videoframe, 0 );
@@ -93,15 +101,15 @@ void FTNoIR_Tracker_SM::Initialize( QFrame *videoframe )
void FTNoIR_Tracker_SM::StartTracker( HWND parent_window )
{
- // starts the faceapi engine
- if (_engine->state() != SM_API_ENGINE_STATE_HT_TRACKING) {
- _engine->start();
- }
+ //// starts the faceapi engine
+ //if (_engine->state() != SM_API_ENGINE_STATE_HT_TRACKING) {
+ // _engine->start();
+ //}
- // some parameteres [optional]
- smHTSetHeadPosePredictionEnabled( _engine->handle(), false);
- smHTSetLipTrackingEnabled( _engine->handle(), false);
- smLoggingSetFileOutputEnable( false );
+ //// some parameteres [optional]
+ //smHTSetHeadPosePredictionEnabled( _engine->handle(), false);
+ //smHTSetLipTrackingEnabled( _engine->handle(), false);
+ //smLoggingSetFileOutputEnable( false );
return;
}
@@ -110,26 +118,36 @@ void FTNoIR_Tracker_SM::StopTracker()
qDebug() << "FTNoIR_Tracker_SM::StopTracker says: Starting ";
// stops the faceapi engine
- _engine->stop();
+//// _engine->stop();
return;
}
bool FTNoIR_Tracker_SM::GiveHeadPoseData(THeadPoseData *data)
{
- smEngineHeadPoseData head_pose; // headpose from faceAPI
- smEngineHeadPoseData temp_head_pose; // headpose from faceAPI
- smReturnCode smret = smHTCurrentHeadPose(_engine->handle(), &temp_head_pose);
- memcpy(&head_pose, &temp_head_pose, sizeof(smEngineHeadPoseData));
+ qDebug() << "FTNoIR_Tracker_SM::GiveHeadPoseData says: Starting ";
- data->x = head_pose.head_pos.x * 100.0f; // From meters to centimeters
- data->y = head_pose.head_pos.y * 100.0f;
- data->z = head_pose.head_pos.z * 100.0f;
- data->yaw = head_pose.head_rot.y_rads * 57.295781f; // From rads to degrees
- data->pitch = head_pose.head_rot.x_rads * 57.295781f;
- data->roll = head_pose.head_rot.z_rads * 57.295781f;
+ //
+ // Check if the pointer is OK and wait for the Mutex.
+ //
+ if ( (pMemData != NULL) && (WaitForSingleObject(hSMMutex, 100) == WAIT_OBJECT_0) ) {
- return ( head_pose.confidence > 0 );
+ qDebug() << "FTNoIR_Tracker_SM::GiveHeadPoseData says: Retrieving data.";
+
+ //
+ // Copy the measurements to FaceTrackNoIR.
+ //
+ data->x = pMemData->data.new_pose.head_pos.x * 100.0f; // From meters to centimeters
+ data->y = pMemData->data.new_pose.head_pos.y * 100.0f;
+ data->z = pMemData->data.new_pose.head_pos.z * 100.0f;
+ data->yaw = pMemData->data.new_pose.head_rot.y_rads * 57.295781f; // From rads to degrees
+ data->pitch = pMemData->data.new_pose.head_rot.x_rads * 57.295781f;
+ data->roll = pMemData->data.new_pose.head_rot.z_rads * 57.295781f;
+
+ ReleaseMutex(hSMMutex);
+ return ( pMemData->data.new_pose.confidence > 0 );
+ }
+ return false;
}
bool FTNoIR_Tracker_SM::setParameterValue(const int index, const float newvalue)
@@ -178,6 +196,62 @@ void FTNoIR_Tracker_SM::loadSettings() {
iniFile.endGroup ();
}
+//
+// Create a memory-mapping to the faceAPI data.
+// It contains the tracking data, a command-code from FaceTrackNoIR
+//
+//
+bool FTNoIR_Tracker_SM::SMCreateMapping()
+{
+ qDebug() << "FTNoIR_Tracker_SM::FTCreateMapping says: Starting Function";
+
+ //
+ // A FileMapping is used to create 'shared memory' between the faceAPI and FaceTrackNoIR.
+ //
+ // Try to create a FileMapping to the Shared Memory.
+ // If one already exists: close it.
+ //
+ hSMMemMap = CreateFileMappingA( INVALID_HANDLE_VALUE , 00 , PAGE_READWRITE , 0 ,
+ sizeof( TFaceData ) + sizeof( HANDLE ) + 100,
+ (LPCSTR) SM_MM_DATA );
+
+ if ( hSMMemMap != 0 ) {
+ qDebug() << "FTNoIR_Tracker_SM::FTCreateMapping says: FileMapping Created!";
+ }
+
+ if ( ( hSMMemMap != 0 ) && ( (long) GetLastError == ERROR_ALREADY_EXISTS ) ) {
+ CloseHandle( hSMMemMap );
+ hSMMemMap = 0;
+ }
+
+ //
+ // Create a new FileMapping, Read/Write access
+ //
+ hSMMemMap = OpenFileMappingA( FILE_MAP_ALL_ACCESS , false , (LPCSTR) SM_MM_DATA );
+ if ( ( hSMMemMap != 0 ) ) {
+ qDebug() << "FTNoIR_Tracker_SM::FTCreateMapping says: FileMapping Created again..." << hSMMemMap;
+ pMemData = (SMMemMap *) MapViewOfFile(hSMMemMap, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(TFaceData));
+ if (pMemData != NULL) {
+ qDebug() << "FTNoIR_Tracker_SM::FTCreateMapping says: MapViewOfFile OK.";
+// pMemData->handle = handle; // The game uses the handle, to send a message that the Program-Name was set!
+ }
+ hSMMutex = CreateMutexA(NULL, false, SM_MUTEX);
+ }
+ else {
+ qDebug() << "FTNoIR_Tracker_SM::FTCreateMapping says: Error creating Shared Memory for faceAPI!";
+ return false;
+ }
+
+ //if (pMemData != NULL) {
+ // pMemData->data.DataID = 1;
+ // pMemData->data.CamWidth = 100;
+ // pMemData->data.CamHeight = 250;
+ //}
+
+ return true;
+}
+
+
////////////////////////////////////////////////////////////////////////////////
// Factory function that creates instances if the Tracker object.