diff options
26 files changed, 1344 insertions, 75 deletions
diff --git a/FTNoIR_Filter_EWMA2/ftnoir_filter_base.h b/FTNoIR_Filter_EWMA2/ftnoir_filter_base.h index dd8c7582..87c5c14f 100644 --- a/FTNoIR_Filter_EWMA2/ftnoir_filter_base.h +++ b/FTNoIR_Filter_EWMA2/ftnoir_filter_base.h @@ -2,7 +2,7 @@ #define FTNOIR_FILTER_BASE_H
#include "ftnoir_filter_base_global.h"
-#include "ftnoir_tracker_base.h"
+#include "..\ftnoir_tracker_base\ftnoir_tracker_base.h"
#include <QString>
#include <QList>
diff --git a/FTNoIR_Tracker_UDP/ftnoir_tracker_base.h b/FTNoIR_Tracker_Base/ftnoir_tracker_base.h index f39a8b4d..f39a8b4d 100644 --- a/FTNoIR_Tracker_UDP/ftnoir_tracker_base.h +++ b/FTNoIR_Tracker_Base/ftnoir_tracker_base.h diff --git a/FTNoIR_Tracker_UDP/ftnoir_tracker_base_global.h b/FTNoIR_Tracker_Base/ftnoir_tracker_base_global.h index 9f4a6118..9f4a6118 100644 --- a/FTNoIR_Tracker_UDP/ftnoir_tracker_base_global.h +++ b/FTNoIR_Tracker_Base/ftnoir_tracker_base_global.h diff --git a/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h new file mode 100644 index 00000000..0687730a --- /dev/null +++ b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.h @@ -0,0 +1,44 @@ +#include "..\ftnoir_tracker_base\ftnoir_tracker_base.h"
+#include "ui_FTNoIR_SMClientcontrols.h"
+
+#include <sm_api_qt.h>
+#include <QMessageBox>
+#include <QSettings>
+#include "Windows.h"
+#include "math.h"
+
+using namespace sm::faceapi;
+using namespace sm::faceapi::qt;
+
+class FTNoIR_Tracker_SM : public ITracker
+{
+public:
+ FTNoIR_Tracker_SM();
+ ~FTNoIR_Tracker_SM();
+
+ void Release();
+ void Initialize();
+ void StartTracker();
+ void GiveHeadPoseData(THeadPoseData *data);
+ void loadSettings();
+
+ bool setParameterValue(const int index, const float newvalue);
+
+private:
+ /** face api variables **/
+ APIScope *faceapi_scope;
+ QSharedPointer<EngineBase> _engine;
+ smEngineHandle _engine_handle;
+
+ THeadPoseData newHeadPose; // Structure with new headpose
+
+ //parameter list for the filter-function(s)
+ enum
+ {
+ kPortAddress=0, // Index in QList
+ kNumFilterParameters // Indicate number of parameters used
+ };
+ QList<std::pair<float,float>> parameterRange;
+ QList<float> parameterValueAsFloat;
+
+};
diff --git a/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj new file mode 100644 index 00000000..243e919b --- /dev/null +++ b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj @@ -0,0 +1,266 @@ +<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="FTNoIR_Tracker_SM"
+ ProjectGUID="{26346BCF-92A5-47A7-B4CF-73C402F7C3AD}"
+ RootNamespace="FTNoIR_Tracker_SM"
+ Keyword="Qt4VSv1.0"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)/bin"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=".\GeneratedFiles;"$(QTDIR)\include";".\GeneratedFiles\$(ConfigurationName)";"$(QTDIR)\include\qtmain";"$(QTDIR)\include\QtCore";"$(QTDIR)\include\QtNetwork";"$(QTDIR)\include\QtGui";.\;"$(SM_API_PATH)\include";"$(SM_API_CPP_WRAPPERS)\include";"$(SM_API_QTDIR)\include";"$(SM_API_WIDGETS)\include""
+ PreprocessorDefinitions="UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_THREAD_SUPPORT;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;FTNOIR_TRACKER_BASE_LIB"
+ RuntimeLibrary="2"
+ TreatWChar_tAsBuiltInType="false"
+ DebugInformationFormat="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="qtmain.lib QtCore4.lib QtGui4.lib QtNetwork4.lib smft32.lib smftcpp.lib smftqt.lib"
+ OutputFile="$(OutDir)\$(ProjectName).dll"
+ AdditionalLibraryDirectories="$(QTDIR)\lib"
+ GenerateDebugInformation="false"
+ SubSystem="2"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=".\GeneratedFiles;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\qtmain;$(QTDIR)\include\QtCore;.\"
+ PreprocessorDefinitions="UNICODE,WIN32,QT_LARGEFILE_SUPPORT,QT_THREAD_SUPPORT,QT_CORE_LIB,FTNOIR_TRACKER_SM_LIB"
+ RuntimeLibrary="3"
+ TreatWChar_tAsBuiltInType="false"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="qtmaind.lib QtCored4.lib"
+ OutputFile="$(OutDir)\$(ProjectName).dll"
+ AdditionalLibraryDirectories="$(QTDIR)\lib"
+ GenerateDebugInformation="true"
+ SubSystem="2"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;cxx;c;def"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\ftnoir_tracker_faceapi.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath=".\FTNoIR_Tracker_SM.h"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description=""
+ CommandLine=""
+ AdditionalDependencies=""
+ Outputs=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description=""
+ CommandLine=""
+ AdditionalDependencies=""
+ Outputs=""
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Form Files"
+ Filter="ui"
+ UniqueIdentifier="{99349809-55BA-4b9d-BF79-8FDBB0286EB3}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="qrc;*"
+ UniqueIdentifier="{D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E}"
+ ParseFiles="false"
+ >
+ </Filter>
+ <Filter
+ Name="Generated Files"
+ Filter="moc;h;cpp"
+ UniqueIdentifier="{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}"
+ SourceControlFiles="false"
+ >
+ <Filter
+ Name="Release"
+ Filter="cpp;moc"
+ SourceControlFiles="false"
+ >
+ </Filter>
+ <Filter
+ Name="Debug"
+ Filter="cpp;moc"
+ SourceControlFiles="false"
+ >
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ <Global
+ Name="lupdateOnBuild"
+ Value="0"
+ />
+ <Global
+ Name="MocDir"
+ Value=".\GeneratedFiles\$(ConfigurationName)"
+ />
+ <Global
+ Name="MocOptions"
+ Value=""
+ />
+ <Global
+ Name="QtVersion Win32"
+ Value="QT462_VS2005"
+ />
+ <Global
+ Name="RccDir"
+ Value=".\GeneratedFiles"
+ />
+ <Global
+ Name="UicDir"
+ Value=".\GeneratedFiles"
+ />
+ </Globals>
+</VisualStudioProject>
diff --git a/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj.VRIEND200810.Wim.user b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj.VRIEND200810.Wim.user new file mode 100644 index 00000000..12f78238 --- /dev/null +++ b/FTNoIR_Tracker_SM/FTNoIR_Tracker_SM.vcproj.VRIEND200810.Wim.user @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioUserFile
+ ProjectType="Visual C++"
+ Version="8.00"
+ ShowAllFiles="false"
+ >
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ >
+ <DebugSettings
+ Command=""
+ WorkingDirectory=""
+ CommandArguments=""
+ Attach="false"
+ DebuggerType="3"
+ Remote="1"
+ RemoteMachine="VRIEND200810"
+ RemoteCommand=""
+ HttpUrl=""
+ PDBPath=""
+ SQLDebugging=""
+ Environment="PATH=$(QTDIR)\bin;"$(QTDIR)\bin;$(PATH)"
+ EnvironmentMerge="true"
+ DebuggerFlavor=""
+ MPIRunCommand=""
+ MPIRunArguments=""
+ MPIRunWorkingDirectory=""
+ ApplicationCommand=""
+ ApplicationArguments=""
+ ShimCommand=""
+ MPIAcceptMode=""
+ MPIAcceptFilter=""
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ >
+ <DebugSettings
+ Command=""
+ WorkingDirectory=""
+ CommandArguments=""
+ Attach="false"
+ DebuggerType="3"
+ Remote="1"
+ RemoteMachine="VRIEND200810"
+ RemoteCommand=""
+ HttpUrl=""
+ PDBPath=""
+ SQLDebugging=""
+ Environment="PATH=$(QTDIR)\bin;"$(QTDIR)\bin;$(PATH)"
+ EnvironmentMerge="true"
+ DebuggerFlavor=""
+ MPIRunCommand=""
+ MPIRunArguments=""
+ MPIRunWorkingDirectory=""
+ ApplicationCommand=""
+ ApplicationArguments=""
+ ShimCommand=""
+ MPIAcceptMode=""
+ MPIAcceptFilter=""
+ />
+ </Configuration>
+ </Configurations>
+</VisualStudioUserFile>
diff --git a/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp b/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp new file mode 100644 index 00000000..930ce090 --- /dev/null +++ b/FTNoIR_Tracker_SM/ftnoir_tracker_faceapi.cpp @@ -0,0 +1,142 @@ +#include "ftnoir_tracker_sm.h"
+
+using namespace sm::faceapi;
+using namespace sm::faceapi::qt;
+
+FTNoIR_Tracker_SM::FTNoIR_Tracker_SM()
+{
+ //allocate memory for the parameters
+ parameterValueAsFloat.clear();
+ parameterRange.clear();
+
+ // Add the parameters to the list
+ parameterRange.append(std::pair<float,float>(1000.0f,9999.0f));
+ parameterValueAsFloat.append(0.0f);
+ setParameterValue(kPortAddress,5551.0f);
+
+ newHeadPose.x = 0.0f;
+ newHeadPose.y = 0.0f;
+ newHeadPose.z = 0.0f;
+ newHeadPose.yaw = 0.0f;
+ newHeadPose.pitch = 0.0f;
+ newHeadPose.roll = 0.0f;
+}
+
+FTNoIR_Tracker_SM::~FTNoIR_Tracker_SM()
+{
+}
+
+void FTNoIR_Tracker_SM::Release()
+{
+ delete this;
+}
+
+void FTNoIR_Tracker_SM::Initialize()
+{
+ qDebug() << "FTNoIR_Tracker_SM::Initialize says: Starting ";
+ loadSettings();
+
+ try {
+ // Initialize the faceAPI Qt library
+ sm::faceapi::qt::initialize();
+ smLoggingSetFileOutputEnable( false );
+
+ // Initialize the API
+ faceapi_scope = new APIScope();
+
+ //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());
+
+ // starts the faceapi engine
+ _engine->start();
+ }
+ catch (sm::faceapi::Error &e)
+ {
+ /* ERROR with camera */
+ QMessageBox::warning(0,"faceAPI Error",e.what(),QMessageBox::Ok,QMessageBox::NoButton);
+ }
+
+ return;
+}
+
+void FTNoIR_Tracker_SM::StartTracker()
+{
+ return;
+}
+
+void FTNoIR_Tracker_SM::GiveHeadPoseData(THeadPoseData *data)
+{
+ data->x = newHeadPose.x;
+ data->y = newHeadPose.y;
+ data->z = newHeadPose.z;
+ data->yaw = newHeadPose.yaw;
+ data->pitch = newHeadPose.pitch;
+ data->roll = newHeadPose.roll;
+ return;
+}
+
+bool FTNoIR_Tracker_SM::setParameterValue(const int index, const float newvalue)
+{
+ if ((index >= 0) && (index < parameterValueAsFloat.size()))
+ {
+ //
+ // Limit the new value, using the defined range.
+ //
+ if (newvalue < parameterRange[index].first) {
+ parameterValueAsFloat[index] = parameterRange[index].first;
+ }
+ else {
+ if (newvalue > parameterRange[index].second) {
+ parameterValueAsFloat[index] = parameterRange[index].second;
+ }
+ else {
+ parameterValueAsFloat[index] = newvalue;
+ }
+ }
+
+// updateParameterString(index);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+};
+
+//
+// Load the current Settings from the currently 'active' INI-file.
+//
+void FTNoIR_Tracker_SM::loadSettings() {
+
+ qDebug() << "FTNoIR_Tracker_SM::loadSettings says: Starting ";
+ QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER)
+
+ QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString();
+ QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file)
+
+ qDebug() << "FTNoIR_Tracker_SM::loadSettings says: iniFile = " << currentFile;
+
+ iniFile.beginGroup ( "FTNClient" );
+ setParameterValue(kPortAddress, (float) iniFile.value ( "PortNumber", 5550 ).toInt());
+ iniFile.endGroup ();
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Factory function that creates instances if the Tracker object.
+
+// Export both decorated and undecorated names.
+// GetTracker - Undecorated name, which can be easily used with GetProcAddress
+// Win32 API function.
+// _GetTracker@0 - Common name decoration for __stdcall functions in C language.
+#pragma comment(linker, "/export:GetTracker=_GetTracker@0")
+
+FTNOIR_TRACKER_BASE_EXPORT TRACKERHANDLE __stdcall GetTracker()
+{
+ return new FTNoIR_Tracker_SM;
+}
diff --git a/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h b/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h index b3467341..9a0cad1f 100644 --- a/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h +++ b/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h @@ -1,4 +1,4 @@ -#include "ftnoir_tracker_base.h"
+#include "..\ftnoir_tracker_base\ftnoir_tracker_base.h"
#include "ui_FTNoIR_FTNClientcontrols.h"
#include <QThread>
#include <QUdpSocket>
diff --git a/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.vcproj b/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.vcproj index ae299ed2..2e01f009 100644 --- a/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.vcproj +++ b/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.vcproj @@ -178,33 +178,11 @@ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
- RelativePath=".\ftnoir_tracker_base.h"
+ RelativePath="..\FTNoIR_Tracker_Base\ftnoir_tracker_base.h"
>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description=""
- CommandLine=""
- AdditionalDependencies=""
- Outputs=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description=""
- CommandLine=""
- AdditionalDependencies=""
- Outputs=""
- />
- </FileConfiguration>
</File>
<File
- RelativePath=".\ftnoir_tracker_base_global.h"
+ RelativePath="..\FTNoIR_Tracker_Base\ftnoir_tracker_base_global.h"
>
</File>
<File
diff --git a/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp b/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp index 93ef60b6..1a64261e 100644 --- a/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp +++ b/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp @@ -88,7 +88,7 @@ quint16 senderPort; //for lower cpu load
usleep(10000);
- yieldCurrentThread();
+// yieldCurrentThread();
}
}
diff --git a/FaceTrackNoIR.sln b/FaceTrackNoIR.sln index d125c314..31b3fa30 100644 --- a/FaceTrackNoIR.sln +++ b/FaceTrackNoIR.sln @@ -11,6 +11,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FTNoIR_Tracker_UDP", "FTNoI EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FTNoIR_Filter_EWMA2", "FTNoIR_Filter_EWMA2\FTNoIR_Filter_EWMA2.vcproj", "{7DD9F1AA-B7C0-4056-AC4A-1501840E6438}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FTNoIR_Tracker_SM", "FTNoIR_Tracker_SM\FTNoIR_Tracker_SM.vcproj", "{26346BCF-92A5-47A7-B4CF-73C402F7C3AD}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
@@ -34,6 +36,10 @@ Global {7DD9F1AA-B7C0-4056-AC4A-1501840E6438}.Debug|Win32.Build.0 = Debug|Win32
{7DD9F1AA-B7C0-4056-AC4A-1501840E6438}.Release|Win32.ActiveCfg = Release|Win32
{7DD9F1AA-B7C0-4056-AC4A-1501840E6438}.Release|Win32.Build.0 = Release|Win32
+ {26346BCF-92A5-47A7-B4CF-73C402F7C3AD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {26346BCF-92A5-47A7-B4CF-73C402F7C3AD}.Debug|Win32.Build.0 = Debug|Win32
+ {26346BCF-92A5-47A7-B4CF-73C402F7C3AD}.Release|Win32.ActiveCfg = Release|Win32
+ {26346BCF-92A5-47A7-B4CF-73C402F7C3AD}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/FaceTrackNoIR.suo b/FaceTrackNoIR.suo Binary files differindex 006a6e0c..f545da19 100644 --- a/FaceTrackNoIR.suo +++ b/FaceTrackNoIR.suo diff --git a/FaceTrackNoIR/FTNServer.cpp b/FaceTrackNoIR/FTNServer.cpp new file mode 100644 index 00000000..101d06a5 --- /dev/null +++ b/FaceTrackNoIR/FTNServer.cpp @@ -0,0 +1,294 @@ +/********************************************************************************
+* FaceTrackNoIR This program is a private project of the some enthusiastic *
+* gamers from Holland, who don't like to pay much for *
+* head-tracking. *
+* *
+* Copyright (C) 2010 Wim Vriend (Developing) *
+* Ron Hendriks (Researching and Testing) *
+* *
+* Homepage *
+* *
+* This program is free software; you can redistribute it and/or modify it *
+* under the terms of the GNU General Public License as published by the *
+* Free Software Foundation; either version 3 of the License, or (at your *
+* option) any later version. *
+* *
+* This program is distributed in the hope that it will be useful, but *
+* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
+* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
+* more details. *
+* *
+* You should have received a copy of the GNU General Public License along *
+* with this program; if not, see <http://www.gnu.org/licenses/>. *
+* *
+* FTNServer FTNServer is the Class, that communicates headpose-data *
+* to another FaceTrackNoIR program, using UDP. *
+* It is based on the (Linux) example made by Melchior FRANZ. *
+********************************************************************************/
+/*
+ Modifications (last one on top):
+ 20101224 - WVR: Base class is no longer inheriting QThread. sendHeadposeToGame
+ is called from run() of Tracker.cpp
+*/
+#include <QtGui>
+#include <QtNetwork>
+#include "FTNServer.h"
+#include "Tracker.h"
+#include <Winsock.h>
+
+/** constructor **/
+FTNServer::FTNServer( Tracker *parent ) {
+
+ // Save the parent
+ headTracker = parent;
+ loadSettings();
+}
+
+/** destructor **/
+FTNServer::~FTNServer() {
+ if (inSocket != 0) {
+ inSocket->close();
+ delete inSocket;
+ }
+
+ if (outSocket != 0) {
+ outSocket->close();
+ delete outSocket;
+ }
+}
+
+//
+// Update Headpose in Game.
+//
+void FTNServer::sendHeadposeToGame() {
+int no_bytes;
+QHostAddress sender;
+quint16 senderPort;
+
+ //
+ // Create UDP-sockets if they don't exist already.
+ // They must be created here, because they must be in the Tracker thread (Tracker::run())
+ //
+ if (inSocket == 0) {
+ qDebug() << "FTNServer::sendHeadposeToGame creating sockets";
+ inSocket = new QUdpSocket();
+ // Connect the inSocket to the port, to receive messages
+ if (!inSocket->bind(QHostAddress::Any, destPort+1)) {
+ qDebug() << "FTNServer::writePendingDatagrams says: unable to bind inSocket!";
+ delete inSocket;
+ inSocket = 0;
+ }
+ }
+
+ if (outSocket == 0) {
+ outSocket = new QUdpSocket();
+ }
+
+ //
+ // Copy the Raw measurements directly to the client.
+ //
+ TestData.x = virtPosX;
+ TestData.y = virtPosY;
+ TestData.z = virtPosZ;
+ TestData.pitch = virtRotX;
+ TestData.yaw = virtRotY;
+ TestData.roll = virtRotZ;
+
+ //
+ // Try to send an UDP-message to the receiver
+ //
+
+ //! [1]
+ no_bytes = outSocket->writeDatagram((const char *) &TestData, sizeof( TestData ), destIP, destPort);
+ if ( no_bytes > 0) {
+// qDebug() << "FTNServer::writePendingDatagrams says: bytes send =" << no_bytes << sizeof( double );
+ }
+ else {
+ qDebug() << "FTNServer::writePendingDatagrams says: nothing sent!";
+ }
+
+ //
+ // Receiver may send data, so we must read that here.
+ //
+ if (inSocket != 0) {
+ while (inSocket->hasPendingDatagrams()) {
+
+ QByteArray datagram;
+ datagram.resize(inSocket->pendingDatagramSize());
+
+ inSocket->readDatagram( (char * ) &cmd, sizeof(cmd), &sender, &senderPort);
+
+ fg_cmd = cmd; // Let's just accept that command for now...
+ if ( cmd > 0 ) {
+ qDebug() << "FTNServer::sendHeadposeToGame hasPendingDatagrams, cmd = " << cmd;
+ headTracker->handleGameCommand ( cmd ); // Send it upstream, for the Tracker to handle
+ }
+ }
+ }
+}
+
+//
+// Check if the Client DLL exists and load it (to test it), if so.
+// Returns 'true' if all seems OK.
+//
+bool FTNServer::checkServerInstallationOK( HANDLE handle )
+{
+ // Init. the data
+ TestData.x = 0.0f;
+ TestData.y = 0.0f;
+ TestData.z = 0.0f;
+ TestData.yaw = 0.0f;
+ TestData.pitch = 0.0f;
+ TestData.roll = 0.0f;
+// TestData.status = 0;
+ fg_cmd = 1;
+
+ inSocket = 0;
+ outSocket = 0;
+
+ return true;
+}
+
+//
+// Load the current Settings from the currently 'active' INI-file.
+//
+void FTNServer::loadSettings() {
+
+ QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER)
+
+ QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString();
+ QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file)
+
+ iniFile.beginGroup ( "FTN" );
+
+ QString destAddr = iniFile.value ( "IP-1", 192 ).toString() + "." + iniFile.value ( "IP-2", 168 ).toString() + "." + iniFile.value ( "IP-3", 2 ).toString() + "." + iniFile.value ( "IP-4", 1 ).toString();
+ destIP = QHostAddress( destAddr );
+ destPort = iniFile.value ( "PortNumber", 5550 ).toInt();
+
+ iniFile.endGroup ();
+}
+
+//
+// Constructor for server-settings-dialog
+//
+FTNServerControls::FTNServerControls( QWidget *parent, Qt::WindowFlags f ) :
+QWidget( parent , f)
+{
+ ui.setupUi( this );
+
+ QPoint offsetpos(100, 100);
+ this->move(parent->pos() + offsetpos);
+
+ // Connect Qt signals to member-functions
+ connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK()));
+ connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel()));
+ connect(ui.spinIPFirstNibble, SIGNAL(valueChanged(int)), this, SLOT(settingChanged()));
+ connect(ui.spinIPSecondNibble, SIGNAL(valueChanged(int)), this, SLOT(settingChanged()));
+ connect(ui.spinIPThirdNibble, SIGNAL(valueChanged(int)), this, SLOT(settingChanged()));
+ connect(ui.spinIPFourthNibble, SIGNAL(valueChanged(int)), this, SLOT(settingChanged()));
+ connect(ui.spinPortNumber, SIGNAL(valueChanged(int)), this, SLOT(settingChanged()));
+
+ // Load the settings from the current .INI-file
+ loadSettings();
+}
+
+//
+// Destructor for server-dialog
+//
+FTNServerControls::~FTNServerControls() {
+ qDebug() << "~FTNServerControls() says: started";
+}
+
+//
+// OK clicked on server-dialog
+//
+void FTNServerControls::doOK() {
+ save();
+ this->close();
+}
+
+// override show event
+void FTNServerControls::showEvent ( QShowEvent * event ) {
+ loadSettings();
+}
+
+//
+// Cancel clicked on server-dialog
+//
+void FTNServerControls::doCancel() {
+ //
+ // Ask if changed Settings should be saved
+ //
+ if (settingsDirty) {
+ int ret = QMessageBox::question ( this, "Settings have changed", "Do you want to save the settings?", QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Discard );
+
+ qDebug() << "doCancel says: answer =" << ret;
+
+ switch (ret) {
+ case QMessageBox::Save:
+ save();
+ this->close();
+ break;
+ case QMessageBox::Discard:
+ this->close();
+ break;
+ case QMessageBox::Cancel:
+ // Cancel was clicked
+ break;
+ default:
+ // should never be reached
+ break;
+ }
+ }
+ else {
+ this->close();
+ }
+}
+
+//
+// Load the current Settings from the currently 'active' INI-file.
+//
+void FTNServerControls::loadSettings() {
+
+// qDebug() << "loadSettings says: Starting ";
+ QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER)
+
+ QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString();
+ QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file)
+
+// qDebug() << "loadSettings says: iniFile = " << currentFile;
+
+ iniFile.beginGroup ( "FTN" );
+ ui.spinIPFirstNibble->setValue( iniFile.value ( "IP-1", 192 ).toInt() );
+ ui.spinIPSecondNibble->setValue( iniFile.value ( "IP-2", 168 ).toInt() );
+ ui.spinIPThirdNibble->setValue( iniFile.value ( "IP-3", 2 ).toInt() );
+ ui.spinIPFourthNibble->setValue( iniFile.value ( "IP-4", 1 ).toInt() );
+
+ ui.spinPortNumber->setValue( iniFile.value ( "PortNumber", 5550 ).toInt() );
+ iniFile.endGroup ();
+
+ settingsDirty = false;
+}
+
+//
+// Save the current Settings to the currently 'active' INI-file.
+//
+void FTNServerControls::save() {
+
+ QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER)
+
+ QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString();
+ QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file)
+
+ iniFile.beginGroup ( "FTN" );
+ iniFile.setValue ( "IP-1", ui.spinIPFirstNibble->value() );
+ iniFile.setValue ( "IP-2", ui.spinIPSecondNibble->value() );
+ iniFile.setValue ( "IP-3", ui.spinIPThirdNibble->value() );
+ iniFile.setValue ( "IP-4", ui.spinIPFourthNibble->value() );
+ iniFile.setValue ( "PortNumber", ui.spinPortNumber->value() );
+ iniFile.endGroup ();
+
+ settingsDirty = false;
+}
+
+//END
diff --git a/FaceTrackNoIR/FTNServer.h b/FaceTrackNoIR/FTNServer.h new file mode 100644 index 00000000..f392e708 --- /dev/null +++ b/FaceTrackNoIR/FTNServer.h @@ -0,0 +1,107 @@ +/********************************************************************************
+* FaceTrackNoIR This program is a private project of the some enthusiastic *
+* gamers from Holland, who don't like to pay much for *
+* head-tracking. *
+* *
+* Copyright (C) 2010 Wim Vriend (Developing) *
+* Ron Hendriks (Researching and Testing) *
+* *
+* Homepage *
+* *
+* This program is free software; you can redistribute it and/or modify it *
+* under the terms of the GNU General Public License as published by the *
+* Free Software Foundation; either version 3 of the License, or (at your *
+* option) any later version. *
+* *
+* This program is distributed in the hope that it will be useful, but *
+* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
+* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
+* more details. *
+* *
+* You should have received a copy of the GNU General Public License along *
+* with this program; if not, see <http://www.gnu.org/licenses/>. *
+* *
+* FTNServer FTNServer is the Class, that communicates headpose-data *
+* to FlightGear, using UDP. *
+* It is based on the (Linux) example made by Melchior FRANZ. *
+********************************************************************************/
+#pragma once
+#ifndef INCLUDED_FTNSERVER_H
+#define INCLUDED_FTNSERVER_H
+
+#include "FTNoIR_cxx_protocolserver.h"
+#include "..\ftnoir_tracker_base\ftnoir_tracker_base.h"
+#include <QString>
+#include <QMessageBox>
+#include <QSettings>
+#include <QFile>
+#include <QApplication>
+#include <QDebug>
+#include <QMutex>
+#include <QLibrary>
+#include <QUdpSocket>
+
+using namespace std;
+using namespace v4friend::ftnoir;
+
+#include "ui_FTNoIR_FTNServercontrols.h"
+
+class Tracker; // pre-define parent-class to avoid circular includes
+
+class FTNServer : public ProtocolServerBase {
+ Q_OBJECT
+
+public:
+
+ // public member methods
+ FTNServer( Tracker *parent );
+ ~FTNServer();
+
+ // protected member methods
+protected:
+ bool checkServerInstallationOK( HANDLE handle );
+ void sendHeadposeToGame();
+ void setVirtPosX(float pos) { virtPosX = pos; }
+ void setVirtPosY(float pos) { virtPosY = pos; }
+ void setVirtPosZ(float pos) { virtPosZ = pos; }
+
+private:
+ Tracker *headTracker; // For upstream messages...
+ THeadPoseData TestData;
+ QUdpSocket *inSocket; // Receive from FligthGear
+ QUdpSocket *outSocket; // Send to FligthGear
+ qint32 cmd;
+ qint32 fg_cmd; // Command from FlightGear
+ QHostAddress destIP; // Destination IP-address
+ int destPort; // Destination port-number
+ void loadSettings();
+};
+
+// Widget that has controls for FTNoIR protocol server-settings.
+class FTNServerControls: public QWidget, public Ui::UICFTNServerControls
+{
+ Q_OBJECT
+public:
+
+ explicit FTNServerControls( QWidget *parent=0, Qt::WindowFlags f=0 );
+ virtual ~FTNServerControls();
+ void showEvent ( QShowEvent * event );
+
+private:
+ Ui::UICFTNServerControls ui;
+ void loadSettings();
+ void save();
+
+ /** helper **/
+ bool settingsDirty;
+
+private slots:
+ void doOK();
+ void doCancel();
+ void settingChanged() { settingsDirty = true; };
+};
+
+
+
+#endif//INCLUDED_FTNSERVER_H
+//END
diff --git a/FaceTrackNoIR/FTNoIR_FTNServerControls.ui b/FaceTrackNoIR/FTNoIR_FTNServerControls.ui new file mode 100644 index 00000000..44c7e99f --- /dev/null +++ b/FaceTrackNoIR/FTNoIR_FTNServerControls.ui @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>UICFTNServerControls</class>
+ <widget class="QWidget" name="UICFTNServerControls">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>411</width>
+ <height>156</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>FTNoIR protocol settings FaceTrackNoIR</string>
+ </property>
+ <property name="windowIcon">
+ <iconset>
+ <normaloff>images/FaceTrackNoIR.ico</normaloff>images/FaceTrackNoIR.ico</iconset>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <layout class="QVBoxLayout" name="_vertical_layout">
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="1" column="4">
+ <widget class="QSpinBox" name="spinIPFourthNibble">
+ <property name="maximumSize">
+ <size>
+ <width>60</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="singleStep">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QSpinBox" name="spinIPFirstNibble">
+ <property name="maximumSize">
+ <size>
+ <width>60</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="singleStep">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QSpinBox" name="spinIPSecondNibble">
+ <property name="maximumSize">
+ <size>
+ <width>60</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="singleStep">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QSpinBox" name="spinIPThirdNibble">
+ <property name="maximumSize">
+ <size>
+ <width>60</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="singleStep">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>IP-address remote PC</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>Port-number</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QSpinBox" name="spinPortNumber">
+ <property name="minimum">
+ <number>5550</number>
+ </property>
+ <property name="maximum">
+ <number>10000</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Enter IP-address and port-number for the remote PC.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Remember: you may have to change firewall-settings too!</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
+ </property>
+ <item>
+ <widget class="QPushButton" name="btnOK">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>100</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnCancel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>100</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>spinIPFirstNibble</tabstop>
+ <tabstop>spinIPSecondNibble</tabstop>
+ <tabstop>spinIPThirdNibble</tabstop>
+ <tabstop>spinIPFourthNibble</tabstop>
+ <tabstop>spinPortNumber</tabstop>
+ <tabstop>btnOK</tabstop>
+ <tabstop>btnCancel</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+ <slots>
+ <slot>startEngineClicked()</slot>
+ <slot>stopEngineClicked()</slot>
+ <slot>cameraSettingsClicked()</slot>
+ </slots>
+</ui>
diff --git a/FaceTrackNoIR/FaceTrackNoIR.cpp b/FaceTrackNoIR/FaceTrackNoIR.cpp index 7197a5f7..d8184fff 100644 --- a/FaceTrackNoIR/FaceTrackNoIR.cpp +++ b/FaceTrackNoIR/FaceTrackNoIR.cpp @@ -398,7 +398,7 @@ void FaceTrackNoIR::loadSettings() { // Put the filename in the window-title.
//
QFileInfo pathInfo ( currentFile );
- setWindowTitle ( "FaceTrackNoIR (1.5) - " + pathInfo.fileName() );
+ setWindowTitle ( "FaceTrackNoIR (1.6) - " + pathInfo.fileName() );
//
// Get a List of all the INI-files in the (currently active) Settings-folder.
@@ -492,7 +492,7 @@ void FaceTrackNoIR::startTracker( ) { // Show the video widget
ui.video_frame->show();
- _display = new VideoDisplayWidget( tracker->getEngine(), ui.video_frame );
+ _display = new VideoDisplayWidget( tracker->getEngine(), ui.video_frame, 0 );
l = new QVBoxLayout(ui.video_frame);
l->setMargin(0);
l->setSpacing(0);
diff --git a/FaceTrackNoIR/tracker.cpp b/FaceTrackNoIR/tracker.cpp index 6455f9b6..2571be40 100644 --- a/FaceTrackNoIR/tracker.cpp +++ b/FaceTrackNoIR/tracker.cpp @@ -55,8 +55,8 @@ #define USE_HEADPOSE_CALLBACK
//#define USE_DEBUG_CLIENT
-using namespace sm::faceapi;
-using namespace sm::faceapi::qt;
+//using namespace sm::faceapi;
+//using namespace sm::faceapi::qt;
// Flags
bool Tracker::confid = false;
@@ -104,27 +104,60 @@ QLibrary *filterLib; Tracker::hTrackMutex = CreateMutexA(NULL, false, "HeadPose_mutex");
+ //
+ // Initialize the headpose-data
+ //
+ Tracker::Yaw.initHeadPoseData();
+ Tracker::Pitch.initHeadPoseData();
+ Tracker::Roll.initHeadPoseData();
+ Tracker::X.initHeadPoseData();
+ Tracker::Y.initHeadPoseData();
+ Tracker::Z.initHeadPoseData();
+
+ //
+ // Start the selected Tracker-engine
+ //
switch (selectedTracker) {
case FT_SM_FACEAPI:
- try {
- // Initialize the faceAPI Qt library
- sm::faceapi::qt::initialize();
- smLoggingSetFileOutputEnable( false );
-
- // Initialize the API
- faceapi_scope = new APIScope;
-
- // Create head-tracking engine v2 using first detected webcam
- CameraInfo::registerType(SM_API_CAMERA_TYPE_WDM);
- _engine = QSharedPointer<HeadTrackerV2>(new HeadTrackerV2());
-
- // starts the faceapi engine
- _engine->start();
- }
- catch (sm::faceapi::Error &e)
- {
- /* ERROR with camera */
- QMessageBox::warning(0,"faceAPI Error",e.what(),QMessageBox::Ok,QMessageBox::NoButton);
+ //try {
+ // // Initialize the faceAPI Qt library
+ // sm::faceapi::qt::initialize();
+ // smLoggingSetFileOutputEnable( false );
+
+ // // Initialize the API
+ // faceapi_scope = new APIScope();
+
+ // //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());
+
+ // // starts the faceapi engine
+ // _engine->start();
+ //}
+ //catch (sm::faceapi::Error &e)
+ //{
+ // /* ERROR with camera */
+ // QMessageBox::warning(0,"faceAPI Error",e.what(),QMessageBox::Ok,QMessageBox::NoButton);
+ //}
+ trackerLib = new QLibrary("FTNoIR_Tracker_SM.dll");
+
+ getIT = (importGetTracker) trackerLib->resolve("GetTracker");
+
+ if (getIT) {
+ ITrackerPtr ptrXyz(getIT());
+ if (ptrXyz)
+ {
+ pTracker = ptrXyz;
+ pTracker->Initialize();
+ qDebug() << "Tracker::setup Function Resolved!";
+ }
+ }
+ else {
+ QMessageBox::warning(0,"FaceTrackNoIR Error", "DLL not loaded",QMessageBox::Ok,QMessageBox::NoButton);
}
break;
@@ -681,7 +714,7 @@ void Tracker::run() { //for lower cpu load
usleep(10000);
- yieldCurrentThread();
+// yieldCurrentThread();
}
}
diff --git a/FaceTrackNoIR/tracker.h b/FaceTrackNoIR/tracker.h index 3eeae2f2..bfed3cd4 100644 --- a/FaceTrackNoIR/tracker.h +++ b/FaceTrackNoIR/tracker.h @@ -23,7 +23,7 @@ #ifndef __TRACKER_H__
#define __TRACKER_H__
-#include <sm_api_qt.h>
+//#include <sm_api_qt.h>
#include <QThread>
#include <QMessageBox>
#include <QLineEdit>
@@ -46,7 +46,7 @@ #include "FTNServer.h" // FaceTrackNoIR-server (for client-server)
#include "FTNoIR_cxx_protocolserver.h"
-#include "FTNoIR_Tracker_base.h"
+#include "..\ftnoir_tracker_base\FTNoIR_Tracker_base.h"
#include "FTNoIR_Filter_base.h"
#include "AutoClosePtr.h"
@@ -94,14 +94,31 @@ class FaceTrackNoIR; // pre-define parent-class to avoid circular includes //
// Structure to hold all variables concerning one of 6 DOF's
//
-struct THeadPoseDOF {
+class THeadPoseDOF {
+public:
+ void initHeadPoseData(){
+ headPos = 0.0f;
+ initial_headPos = 0.0f;
+ offset_headPos = 0.0f;
+ invert = 0.0f;
+ red = 0.0f;
+ rawList.clear();
+ maxItems = 10.0f;
+ prevPos = 0.0f;
+ prevRawPos = 0.0f;
+// curve.???
+ NeutralZone = 0;
+ MaxInput = 0;
+ confidence = 0.0f;
+ newSample = FALSE;
+ }
float headPos; // Current position (from faceTracker, radials or meters)
float initial_headPos; // Position on startup (first valid value)
float offset_headPos; // Offset for centering
float invert; // Invert measured value (= 1.0f or -1.0f)
float red; // Reduction factor (used for EWMA-filtering, between 0.0f and 1.0f)
QList<float> rawList; // List of 'n' headPos values (used for moving average)
- int maxItems; // Maximum number of elements is rawList
+ int maxItems; // Maximum number of elements in rawList
float prevPos; // Previous Position
float prevRawPos; // Previous Raw Position
QPainterPath curve; // Bezier curve to translate input -> output
@@ -138,10 +155,10 @@ private: FTNoIR_Client selectedClient;
FTNoIR_Face_Tracker selectedTracker;
- /** face api variables **/
- APIScope *faceapi_scope;
- QSharedPointer<EngineBase> _engine;
- smEngineHandle _engine_handle;
+ ///** face api variables **/
+// APIScope *faceapi_scope;
+ // QSharedPointer<EngineBase> _engine;
+ //smEngineHandle _engine_handle;
static ITrackerPtr pTracker; // Pointer to Tracker instance (in DLL)
static IFilterPtr pFilter; // Pointer to Filter instance (in DLL)
diff --git a/List of compatible games.xls b/List of compatible games.xls Binary files differindex c95bafb0..27f99e67 100644 --- a/List of compatible games.xls +++ b/List of compatible games.xls diff --git a/List of compatible webcams.xls b/List of compatible webcams.xls Binary files differindex db8cd81a..4c53818d 100644 --- a/List of compatible webcams.xls +++ b/List of compatible webcams.xls diff --git a/bin/FaceTrackNoIR.exe b/bin/FaceTrackNoIR.exe Binary files differindex 389124a0..0a93dfc9 100644 --- a/bin/FaceTrackNoIR.exe +++ b/bin/FaceTrackNoIR.exe diff --git a/bin/Settings/ArmA.ini b/bin/Settings/ArmA.ini index 1d87a0b7..cb6471d1 100644 --- a/bin/Settings/ArmA.ini +++ b/bin/Settings/ArmA.ini @@ -1,5 +1,5 @@ [Tracking]
-Smooth=3
+Smooth=10
NeutralZone=5
sensYaw=90
sensPitch=90
@@ -20,9 +20,9 @@ redRoll=60 redX=71
redY=70
redZ=70
-minSmooth=15
-powCurve=10
-maxSmooth=50
+minSmooth=20
+powCurve=5
+maxSmooth=70
[GameProtocol]
Selection=0
@@ -58,7 +58,7 @@ Keycode_Center=199 Shift_Center=false
Ctrl_Center=false
Alt_Center=false
-Keycode_StartStop=211
+Keycode_StartStop=207
Shift_StartStop=false
Ctrl_StartStop=false
Alt_StartStop=false
@@ -72,6 +72,8 @@ Inhibit_Roll=false Inhibit_X=false
Inhibit_Y=false
Inhibit_Z=false
+SetZero=false
+SetEngineStop=false
[TrackerSource]
Selection=0
diff --git a/bin/Settings/FF5.ini b/bin/Settings/FF5.ini index db4901fd..85d0502c 100644 --- a/bin/Settings/FF5.ini +++ b/bin/Settings/FF5.ini @@ -1,5 +1,5 @@ [Tracking]
-Smooth=15
+Smooth=10
NeutralZone=5
sensYaw=200
sensPitch=200
@@ -7,8 +7,8 @@ sensRoll=100 sensX=100
sensY=100
sensZ=100
-invertYaw=true
-invertPitch=false
+invertYaw=false
+invertPitch=true
invertRoll=false
invertX=true
invertY=false
@@ -20,6 +20,60 @@ redRoll=75 redX=75
redY=75
redZ=75
+minSmooth=20
+powCurve=10
+maxSmooth=70
[GameProtocol]
Selection=4
+
+[Curves]
+Yaw_point1=@Variant(\0\0\0\x1a@\b\0\0\0\0\0\0@\x18\0\0\0\0\0\0)
+Yaw_point2=@Variant(\0\0\0\x1a@@\x80\0\0\0\0\0@1\0\0\0\0\0\0)
+Yaw_point3=@Variant(\0\0\0\x1a@P\xc0\0\0\0\0\0@@\x80\0\0\0\0\0)
+Yaw_point4=@Variant(\0\0\0\x1a@e`\0\0\0\0\0@I\0\0\0\0\0\0)
+Pitch_point1=@Variant(\0\0\0\x1a@\x14\0\0\0\0\0\0@\x14\0\0\0\0\0\0)
+Pitch_point2=@Variant(\0\0\0\x1a@@\x80\0\0\0\0\0@1\0\0\0\0\0\0)
+Pitch_point3=@Variant(\0\0\0\x1a@R\0\0\0\0\0\0@@\x80\0\0\0\0\0)
+Pitch_point4=@Variant(\0\0\0\x1a@e\x80\0\0\0\0\0@I\0\0\0\0\0\0)
+Roll_point1=@Variant(\0\0\0\x1a@\x10\0\0\0\0\0\0@\x18\0\0\0\0\0\0)
+Roll_point2=@Variant(\0\0\0\x1a@1\0\0\0\0\0\0@1\0\0\0\0\0\0)
+Roll_point3=@Variant(\0\0\0\x1a@D\x80\0\0\0\0\0@A\0\0\0\0\0\0)
+Roll_point4=@Variant(\0\0\0\x1a@Y@\0\0\0\0\0@I\0\0\0\0\0\0)
+X_point1=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0@\x14\0\0\0\0\0\0)
+X_point2="@Variant(\0\0\0\x1a@;\0\0\0\0\0\0@1\0\0\0\0\0\0)"
+X_point3=@Variant(\0\0\0\x1a@K\0\0\0\0\0\0@B\0\0\0\0\0\0)
+X_point4=@Variant(\0\0\0\x1a@Z@\0\0\0\0\0@I\0\0\0\0\0\0)
+Y_point1=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0@\x14\0\0\0\0\0\0)
+Y_point2=@Variant(\0\0\0\x1a@A\0\0\0\0\0\0@4\0\0\0\0\0\0)
+Y_point3=@Variant(\0\0\0\x1a@O\x80\0\0\0\0\0@B\x80\0\0\0\0\0)
+Y_point4=@Variant(\0\0\0\x1a@Z\0\0\0\0\0\0@I\0\0\0\0\0\0)
+Z_point1=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0@\x14\0\0\0\0\0\0)
+Z_point2=@Variant(\0\0\0\x1a@<\0\0\0\0\0\0@3\0\0\0\0\0\0)
+Z_point3=@Variant(\0\0\0\x1a@N\x80\0\0\0\0\0@D\0\0\0\0\0\0)
+Z_point4=@Variant(\0\0\0\x1a@Y\x80\0\0\0\0\0@I\0\0\0\0\0\0)
+
+[TrackerSource]
+Selection=0
+
+[KB_Shortcuts]
+Keycode_Center=199
+Shift_Center=false
+Ctrl_Center=false
+Alt_Center=false
+Keycode_StartStop=207
+Shift_StartStop=false
+Ctrl_StartStop=false
+Alt_StartStop=false
+SetZero=false
+SetEngineStop=false
+Keycode_Inhibit=0
+Shift_Inhibit=false
+Ctrl_Inhibit=false
+Alt_Inhibit=false
+Inhibit_Pitch=false
+Inhibit_Yaw=false
+Inhibit_Roll=false
+Inhibit_X=false
+Inhibit_Y=false
+Inhibit_Z=false
diff --git a/bin/Settings/SimConnect.ini b/bin/Settings/SimConnect.ini index 95b6202b..b8d1db51 100644 --- a/bin/Settings/SimConnect.ini +++ b/bin/Settings/SimConnect.ini @@ -1,5 +1,5 @@ [Tracking]
-Smooth=4
+Smooth=10
invertYaw=false
invertPitch=false
invertRoll=false
@@ -13,7 +13,7 @@ redRoll=90 redX=90
redY=90
redZ=90
-minSmooth=10
+minSmooth=20
powCurve=12
maxSmooth=70
@@ -58,7 +58,7 @@ Keycode_StartStop=207 Shift_StartStop=false
Ctrl_StartStop=false
Alt_StartStop=false
-SetZero=true
+SetZero=false
Keycode_Inhibit=0
Shift_Inhibit=false
Ctrl_Inhibit=false
@@ -69,7 +69,7 @@ Inhibit_Roll=false Inhibit_X=false
Inhibit_Y=false
Inhibit_Z=false
-SetEngineStop=true
+SetEngineStop=false
[FTN]
LocalPCOnly=true
diff --git a/bin/Settings/Wings of Prey.ini b/bin/Settings/Wings of Prey.ini index 742e3ec4..6e34cb00 100644 --- a/bin/Settings/Wings of Prey.ini +++ b/bin/Settings/Wings of Prey.ini @@ -1,5 +1,5 @@ [Tracking]
-Smooth=3
+Smooth=7
NeutralZone=5
sensYaw=200
sensPitch=200
@@ -20,9 +20,9 @@ redRoll=60 redX=50
redY=50
redZ=50
-minSmooth=10
-powCurve=2
-maxSmooth=50
+minSmooth=20
+powCurve=10
+maxSmooth=70
[GameProtocol]
Selection=4
diff --git a/bin/image6.0.dll b/bin/image6.0.dll Binary files differindex 17a1e7b4..5024bd10 100644 --- a/bin/image6.0.dll +++ b/bin/image6.0.dll |