summaryrefslogtreecommitdiffhomepage
path: root/tracker-kinect-face
diff options
context:
space:
mode:
authorStéphane Lenclud <github@lenclud.com>2019-02-02 21:51:27 +0100
committerStéphane Lenclud <github@lenclud.com>2019-02-07 13:24:13 +0100
commit997df9f3cbc9ef04c666e404b96ac4b02097b4f3 (patch)
tree62bb6b0c653cc1ed5a15208ca8134475c4717d68 /tracker-kinect-face
parent32c809f5e0c6a9b6a5f202fffe5d034125957551 (diff)
Kinect: now with basic video preview.
We have a massive memory leak, could have been there before though.
Diffstat (limited to 'tracker-kinect-face')
-rw-r--r--tracker-kinect-face/CMakeLists.txt63
-rw-r--r--tracker-kinect-face/tracker.cpp44
-rw-r--r--tracker-kinect-face/tracker.h6
3 files changed, 75 insertions, 38 deletions
diff --git a/tracker-kinect-face/CMakeLists.txt b/tracker-kinect-face/CMakeLists.txt
index cbdc2a97..e12534b2 100644
--- a/tracker-kinect-face/CMakeLists.txt
+++ b/tracker-kinect-face/CMakeLists.txt
@@ -1,37 +1,40 @@
# Kinect SDK is Windows only
if (WIN32)
- # Setup cache variable to Kinect SDK path
- if(DEFINED ENV{KINECTSDK20_DIR})
- set(KINECTSDK20_DIR $ENV{KINECTSDK20_DIR} CACHE PATH $ENV{KINECTSDK20_DIR})
- else()
- set(KINECTSDK20_DIR $ENV{KINECTSDK20_DIR} CACHE PATH "")
- endif()
+ find_package(OpenCV QUIET)
+ if(OpenCV_FOUND)
+ # Setup cache variable to Kinect SDK path
+ if(DEFINED ENV{KINECTSDK20_DIR})
+ set(KINECTSDK20_DIR $ENV{KINECTSDK20_DIR} CACHE PATH $ENV{KINECTSDK20_DIR})
+ else()
+ set(KINECTSDK20_DIR $ENV{KINECTSDK20_DIR} CACHE PATH "")
+ endif()
- # If we have a valid SDK path, try build that tracker
- if(EXISTS ${KINECTSDK20_DIR})
- # Register our module
- otr_module(tracker-kinect-face)
+ # If we have a valid SDK path, try build that tracker
+ if(EXISTS ${KINECTSDK20_DIR})
+ # Register our module
+ otr_module(tracker-kinect-face)
- # Add include path to Kinect SDK
- target_include_directories(opentrack-tracker-kinect-face SYSTEM PUBLIC ${KINECTSDK20_DIR}/inc)
+ # Add include path to Kinect SDK
+ target_include_directories(opentrack-tracker-kinect-face SYSTEM PUBLIC ${KINECTSDK20_DIR}/inc)
- # Check processor architecture
- if(CMAKE_SIZEOF_VOID_P EQUAL 4)
- # 32 bits
- set (kinect-arch-dir "x86")
- elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
- # 64 bits
- set (kinect-arch-dir "x64")
- endif()
+ # Check processor architecture
+ if(CMAKE_SIZEOF_VOID_P EQUAL 4)
+ # 32 bits
+ set (kinect-arch-dir "x86")
+ elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
+ # 64 bits
+ set (kinect-arch-dir "x64")
+ endif()
- # Link against Kinect SDK libraries
- target_link_libraries(opentrack-tracker-kinect-face ${KINECTSDK20_DIR}/lib/${kinect-arch-dir}/Kinect20.lib ${KINECTSDK20_DIR}/lib/${kinect-arch-dir}/Kinect20.Face.lib)
-
- # Install Kinect Face DLL
- install(FILES ${KINECTSDK20_DIR}/Redist/Face/${kinect-arch-dir}/Kinect20.Face.dll DESTINATION ./modules/ PERMISSIONS ${opentrack-perms-exec})
- # Install Kinect Face Database
- install(DIRECTORY ${KINECTSDK20_DIR}/Redist/Face/${kinect-arch-dir}/NuiDatabase DESTINATION ./modules/)
-
- endif()
+ # Link against Kinect SDK libraries
+ target_link_libraries(opentrack-tracker-kinect-face ${KINECTSDK20_DIR}/lib/${kinect-arch-dir}/Kinect20.lib ${KINECTSDK20_DIR}/lib/${kinect-arch-dir}/Kinect20.Face.lib)
+ # Link against OpenCV stuff, needed for video preview
+ target_link_libraries(opentrack-tracker-kinect-face opencv_imgproc opentrack-cv opencv_core)
-endif() \ No newline at end of file
+ # Install Kinect Face DLL
+ install(FILES ${KINECTSDK20_DIR}/Redist/Face/${kinect-arch-dir}/Kinect20.Face.dll DESTINATION ./modules/ PERMISSIONS ${opentrack-perms-exec})
+ # Install Kinect Face Database
+ install(DIRECTORY ${KINECTSDK20_DIR}/Redist/Face/${kinect-arch-dir}/NuiDatabase DESTINATION ./modules/)
+ endif(EXISTS ${KINECTSDK20_DIR})
+ endif(OpenCV_FOUND)
+endif(WIN32) \ No newline at end of file
diff --git a/tracker-kinect-face/tracker.cpp b/tracker-kinect-face/tracker.cpp
index c5517f89..073cf0be 100644
--- a/tracker-kinect-face/tracker.cpp
+++ b/tracker-kinect-face/tracker.cpp
@@ -2,6 +2,9 @@
#include "tracker.h"
+#include <QLayout>
+#include <QPainter>
+
///
@@ -137,6 +140,15 @@ module_status KinectFaceTracker::start_tracker(QFrame* aFrame)
if (SUCCEEDED(InitializeDefaultSensor()))
{
+ // Setup our video preview widget
+ iVideoWidget = std::make_unique<cv_video_widget>(aFrame);
+ iLayout = std::make_unique<QHBoxLayout>(aFrame);
+ iLayout->setContentsMargins(0, 0, 0, 0);
+ iLayout->addWidget(iVideoWidget.get());
+ aFrame->setLayout(iLayout.get());
+ //video_widget->resize(video_frame->width(), video_frame->height());
+ aFrame->show();
+
return status_ok();
}
@@ -161,12 +173,11 @@ void KinectFaceTracker::data(double *data)
const double dt = t.elapsed_seconds();
t.start();
-
Update();
- //TODO: check if data is valid
ExtractFaceRotationInDegrees(&iFaceRotationQuaternion, &iFaceRotation.X, &iFaceRotation.Y, &iFaceRotation.Z);
+ //Check if data is valid
if (!IsNullPoint(iFacePosition) && !IsNullPoint(iFaceRotation))
{
// We have valid tracking retain position and rotation
@@ -218,8 +229,6 @@ void KinectFaceTracker::ExtractFaceRotationInDegrees(const Vector4* pQuaternion,
*pPitch = dPitch;
*pYaw = dYaw;
*pRoll = dRoll;
-
-
}
@@ -348,7 +357,8 @@ void KinectFaceTracker::Update()
if (SUCCEEDED(hr))
{
- if (imageFormat == ColorImageFormat_Bgra)
+ // Fetch color buffer
+ if (imageFormat == ColorImageFormat_Rgba)
{
hr = pColorFrame->AccessRawUnderlyingBuffer(&nBufferSize, reinterpret_cast<BYTE**>(&pBuffer));
}
@@ -356,12 +366,13 @@ void KinectFaceTracker::Update()
{
pBuffer = m_pColorRGBX;
nBufferSize = cColorWidth * cColorHeight * sizeof(RGBQUAD);
- hr = pColorFrame->CopyConvertedFrameDataToArray(nBufferSize, reinterpret_cast<BYTE*>(pBuffer), ColorImageFormat_Bgra);
+ hr = pColorFrame->CopyConvertedFrameDataToArray(nBufferSize, reinterpret_cast<BYTE*>(pBuffer), ColorImageFormat_Rgba);
}
else
{
hr = E_FAIL;
}
+
}
if (SUCCEEDED(hr))
@@ -370,6 +381,24 @@ void KinectFaceTracker::Update()
ProcessFaces();
}
+ if (SUCCEEDED(hr))
+ {
+ // Setup our image
+ QImage image((const unsigned char*)pBuffer, cColorWidth, cColorHeight, sizeof(RGBQUAD)*cColorWidth, QImage::Format_RGBA8888);
+ if (IsValidRect(iFaceBox))
+ {
+ // Draw our face bounding box
+ QPainter painter(&image);
+ painter.setBrush(Qt::NoBrush);
+ painter.setPen(QPen(Qt::red, 8));
+ painter.drawRect(iFaceBox.Left, iFaceBox.Top, iFaceBox.Right - iFaceBox.Left, iFaceBox.Bottom - iFaceBox.Top);
+ bool bEnd = painter.end();
+ }
+
+ // Update our video preview
+ iVideoWidget->update_image(image);
+ }
+
SafeRelease(pFrameDescription);
}
@@ -465,7 +494,6 @@ void KinectFaceTracker::ProcessFaces()
//IFaceFrameResult* pFaceFrameResult = nullptr;
IFaceAlignment* pFaceAlignment = nullptr;
CreateFaceAlignment(&pFaceAlignment); // TODO: check return?
- RectI faceBox = { 0 };
//D2D1_POINT_2F faceTextLayout;
//hr = pFaceFrame->get_FaceFrameResult(&pFaceFrameResult);
@@ -475,7 +503,7 @@ void KinectFaceTracker::ProcessFaces()
// need to verify if pFaceFrameResult contains data before trying to access it
if (SUCCEEDED(hr) && pFaceAlignment != nullptr)
{
- hr = pFaceAlignment->get_FaceBoundingBox(&faceBox);
+ hr = pFaceAlignment->get_FaceBoundingBox(&iFaceBox);
//pFaceFrameResult->get_FaceBoundingBoxInColorSpace();
if (SUCCEEDED(hr))
diff --git a/tracker-kinect-face/tracker.h b/tracker-kinect-face/tracker.h
index 1f986e22..5068f185 100644
--- a/tracker-kinect-face/tracker.h
+++ b/tracker-kinect-face/tracker.h
@@ -6,6 +6,7 @@
#include "api/plugin-api.hpp"
#include "compat/timer.hpp"
#include "compat/macros.hpp"
+#include "cv/video-widget.hpp"
// Kinect Header files
#include <Kinect.h>
@@ -69,6 +70,8 @@ private:
//
RGBQUAD* m_pColorRGBX;
+ RectI iFaceBox = { 0 };
+
CameraSpacePoint iLastFacePosition;
CameraSpacePoint iFacePosition;
CameraSpacePoint iFacePositionCenter;
@@ -78,4 +81,7 @@ private:
CameraSpacePoint iLastFaceRotation;
CameraSpacePoint iFaceRotation;
CameraSpacePoint iFaceRotationCenter;
+ //
+ std::unique_ptr<cv_video_widget> iVideoWidget;
+ std::unique_ptr<QLayout> iLayout;
};