summaryrefslogtreecommitdiffhomepage
path: root/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp
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/ftnoir_tracker_faceapi.cpp
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/ftnoir_tracker_faceapi.cpp')
-rw-r--r--FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp194
1 files changed, 134 insertions, 60 deletions
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.