summaryrefslogtreecommitdiffhomepage
path: root/tracker-rs/rs_impl
diff options
context:
space:
mode:
Diffstat (limited to 'tracker-rs/rs_impl')
-rw-r--r--tracker-rs/rs_impl/bin/opentrack-tracker-rs-impl.dllbin0 -> 72704 bytes
-rw-r--r--tracker-rs/rs_impl/bin/opentrack-tracker-rs-impl.exebin93696 -> 0 bytes
-rw-r--r--tracker-rs/rs_impl/bin/opentrack-tracker-rs-impl.libbin0 -> 2882 bytes
-rw-r--r--tracker-rs/rs_impl/build.bat3
-rw-r--r--tracker-rs/rs_impl/ftnoir_tracker_rs_impl.cpp75
-rw-r--r--tracker-rs/rs_impl/ftnoir_tracker_rs_impl.h1
6 files changed, 69 insertions, 10 deletions
diff --git a/tracker-rs/rs_impl/bin/opentrack-tracker-rs-impl.dll b/tracker-rs/rs_impl/bin/opentrack-tracker-rs-impl.dll
new file mode 100644
index 00000000..d6e0a261
--- /dev/null
+++ b/tracker-rs/rs_impl/bin/opentrack-tracker-rs-impl.dll
Binary files differ
diff --git a/tracker-rs/rs_impl/bin/opentrack-tracker-rs-impl.exe b/tracker-rs/rs_impl/bin/opentrack-tracker-rs-impl.exe
deleted file mode 100644
index e00ed69c..00000000
--- a/tracker-rs/rs_impl/bin/opentrack-tracker-rs-impl.exe
+++ /dev/null
Binary files differ
diff --git a/tracker-rs/rs_impl/bin/opentrack-tracker-rs-impl.lib b/tracker-rs/rs_impl/bin/opentrack-tracker-rs-impl.lib
new file mode 100644
index 00000000..47743c50
--- /dev/null
+++ b/tracker-rs/rs_impl/bin/opentrack-tracker-rs-impl.lib
Binary files differ
diff --git a/tracker-rs/rs_impl/build.bat b/tracker-rs/rs_impl/build.bat
index 3a44fed5..799630b2 100644
--- a/tracker-rs/rs_impl/build.bat
+++ b/tracker-rs/rs_impl/build.bat
@@ -3,4 +3,5 @@ IF DEFINED %VS120COMNTOOLS%] (
) ELSE (
cd "%VS140COMNTOOLS%\..\..\VC"
)
-vcvarsall x64 && cd %~dp0 && CL /nologo /Ox /DUNICODE /D_UNICODE /MT /I"%RSSDK_DIR%\opensource\include" ftnoir_tracker_rs_impl.cpp udp_sender.cpp "%RSSDK_DIR%\opensource\src\libpxc\libpxc.cpp" /link ADVAPI32.LIB Ws2_32.lib /SUBSYSTEM:CONSOLE /OUT:bin\opentrack-tracker-rs-impl.exe \ No newline at end of file
+
+vcvarsall x86 && cd %~dp0 && CL /nologo /Ox /DUNICODE /D_UNICODE /DEXPORT_RS_IMPL /MT /I"%RSSDK_DIR%\opensource\include" ftnoir_tracker_rs_impl.cpp "%RSSDK_DIR%\opensource\src\libpxc\libpxc.cpp" /link ADVAPI32.LIB /DLL /OUT:bin\opentrack-tracker-rs-impl.dll \ No newline at end of file
diff --git a/tracker-rs/rs_impl/ftnoir_tracker_rs_impl.cpp b/tracker-rs/rs_impl/ftnoir_tracker_rs_impl.cpp
index c1ba5c75..75499c71 100644
--- a/tracker-rs/rs_impl/ftnoir_tracker_rs_impl.cpp
+++ b/tracker-rs/rs_impl/ftnoir_tracker_rs_impl.cpp
@@ -8,11 +8,18 @@
#include "ftnoir_tracker_rs_impl.h"
#include <pxcsensemanager.h>
#include <pxcfaceconfiguration.h>
+#include <windows.h>
+
+const size_t kPreviewStreamWidth = 640;
+const size_t kPreviewStreamHeight = 480;
PXCSenseManager* g_senseManager = NULL;
PXCFaceData* g_faceData = NULL;
+void* g_previewImage = NULL;
+
+CRITICAL_SECTION g_criticalSection;
-pxcStatus rs_tracker_set_configuration(PXCFaceModule *faceModule){
+pxcStatus set_face_module_configuration(PXCFaceModule *faceModule){
pxcStatus retStatus;
PXCFaceConfiguration *faceConfig = NULL;
@@ -43,7 +50,37 @@ pxcStatus rs_tracker_set_configuration(PXCFaceModule *faceModule){
return PXC_STATUS_NO_ERROR;
}
+pxcStatus retrieve_preview_from_frame(){
+ pxcStatus retStatus = PXC_STATUS_NO_ERROR;
+ PXCCapture::Sample* sample = g_senseManager->QuerySample();
+ PXCImage::ImageInfo info = sample->depth->QueryInfo();
+
+ if(info.width>kPreviewStreamWidth || info.height>kPreviewStreamHeight)
+ return PXC_STATUS_PARAM_UNSUPPORTED;
+
+ PXCImage::ImageData depthData;
+ retStatus = sample->depth->AcquireAccess(PXCImage::Access::ACCESS_READ, PXCImage::PIXEL_FORMAT_RGB32, &depthData);
+
+ if(retStatus == PXC_STATUS_NO_ERROR){
+ EnterCriticalSection(&g_criticalSection);
+
+ for(int i=0; i<info.height; ++i)
+ for(int j=0; j<info.width; ++j)
+ ((unsigned char*)g_previewImage)[i*info.width+j]=((unsigned char*)depthData.planes[0])[(i+1)*4*info.width-4*(j+1)]; //mirror and convert from RGB32 to Y8.
+
+ LeaveCriticalSection(&g_criticalSection);
+
+ sample->depth->ReleaseAccess(&depthData);
+ }
+
+ return retStatus;
+}
+
int rs_tracker_impl_start(){
+ InitializeCriticalSection(&g_criticalSection);
+ g_previewImage = malloc(kPreviewStreamWidth*kPreviewStreamHeight);
+ memset(g_previewImage, 0, kPreviewStreamWidth*kPreviewStreamHeight);
+
pxcStatus retStatus;
PXCFaceModule *faceModule = NULL;
@@ -65,7 +102,7 @@ int rs_tracker_impl_start(){
return PXC_STATUS_HANDLE_INVALID;
}
- retStatus = rs_tracker_set_configuration(faceModule);
+ retStatus = set_face_module_configuration(faceModule);
if (retStatus != PXC_STATUS_NO_ERROR){
rs_tracker_impl_end();
return PXC_STATUS_HANDLE_INVALID;
@@ -86,7 +123,18 @@ int rs_tracker_impl_start(){
return PXC_STATUS_NO_ERROR;
}
-int rs_tracker_impl_update_pose(double *data){
+int rs_tracker_impl_get_preview(void* previewImageOut, int width, int height){
+ if(width!=kPreviewStreamWidth || height!=kPreviewStreamHeight || g_previewImage == NULL)
+ return -1;//TODO: improve errors communication.
+
+ EnterCriticalSection(&g_criticalSection);
+ memcpy(previewImageOut, g_previewImage, kPreviewStreamWidth*kPreviewStreamHeight);
+ LeaveCriticalSection(&g_criticalSection);
+
+ return PXC_STATUS_HANDLE_INVALID;
+}
+
+int rs_tracker_impl_update_pose(double *data){//TODO: add bool preview activated.
pxcStatus retStatus;
PXCFaceData::PoseEulerAngles angles;
PXCFaceData::HeadPosition headPosition;
@@ -95,9 +143,11 @@ int rs_tracker_impl_update_pose(double *data){
bool poseAnglesAvailable = false;
bool headPositionAvailable = false;
- if (g_senseManager != NULL && g_faceData != NULL
+ if (g_senseManager != NULL && g_faceData != NULL && g_previewImage != NULL
&& (retStatus = g_senseManager->AcquireFrame(true, 16)) == PXC_STATUS_NO_ERROR){
-
+
+ retrieve_preview_from_frame();
+
retStatus = g_faceData->Update();
if (retStatus != PXC_STATUS_NO_ERROR){
rs_tracker_impl_end();
@@ -105,8 +155,8 @@ int rs_tracker_impl_update_pose(double *data){
}
pxcI32 numberOfDetectedFaces = g_faceData->QueryNumberOfDetectedFaces();
- for (pxcI32 i = 0; i < numberOfDetectedFaces; ++i) {
- face = g_faceData->QueryFaceByIndex(0);
+ for(int i=0; i<numberOfDetectedFaces; ++i) {
+ face = g_faceData->QueryFaceByIndex(i);
if (face == NULL) continue;
pose = face->QueryPose();
@@ -128,13 +178,15 @@ int rs_tracker_impl_update_pose(double *data){
//yaw, pitch, roll: degrees
data[3] = -angles.yaw;
data[4] = angles.pitch;
- data[5] = -angles.roll;
+ data[5] = angles.roll;
+
+ break;
}
g_senseManager->ReleaseFrame();
}
- return retStatus;
+ return retStatus;
}
int rs_tracker_impl_end(){
@@ -147,5 +199,10 @@ int rs_tracker_impl_end(){
g_senseManager->Release();
g_senseManager = NULL;
}
+
+ DeleteCriticalSection(&g_criticalSection);
+
+ free(g_previewImage);
+
return PXC_STATUS_NO_ERROR;
}
diff --git a/tracker-rs/rs_impl/ftnoir_tracker_rs_impl.h b/tracker-rs/rs_impl/ftnoir_tracker_rs_impl.h
index 0e4073d0..a4c03ce8 100644
--- a/tracker-rs/rs_impl/ftnoir_tracker_rs_impl.h
+++ b/tracker-rs/rs_impl/ftnoir_tracker_rs_impl.h
@@ -15,5 +15,6 @@
extern "C" {
RSTRACKERIMPL_VISIBILITY int rs_tracker_impl_start();
RSTRACKERIMPL_VISIBILITY int rs_tracker_impl_update_pose(double *pose);
+ RSTRACKERIMPL_VISIBILITY int rs_tracker_impl_get_preview(void* data, int width, int height);
RSTRACKERIMPL_VISIBILITY int rs_tracker_impl_end();
}