B
Hi,
ich möchte mit der Kinect meine rechte Hand tracken
und ihre Koordinaten in Pixel ausgeben.
#include "KinectManager.h"
#include "stdafx.h"
KinectManager::KinectManager(){
printf("Constructor");
if(SUCCEEDED(this->connect())){
while(true){
ProcessSkeleton();
}
}
};
KinectManager::~KinectManager(){};
HRESULT KinectManager::connect(){
INuiSensor * pNuiSensor;
HRESULT hr;
int iSensorCount = 0;
hr = NuiGetSensorCount(&iSensorCount);
hr = NuiCreateSensorByIndex(0, &pNuiSensor);
hr = pNuiSensor->NuiStatus();
if (S_OK == hr)
{
sensor = pNuiSensor;
}
hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_SKELETON);
if (SUCCEEDED(hr))
{
printf("Kinect wurde initialisiert\n");
m_hNextSkeletonEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
hr = sensor->NuiSkeletonTrackingEnable(m_hNextSkeletonEvent, 0);
}
else if (NULL == sensor || FAILED(hr)){
printf("Fehlgeschlagen");
}
return hr;
}
void KinectManager::ProcessSkeleton(){
NUI_SKELETON_FRAME skeletonFrame;
NUI_TRANSFORM_SMOOTH_PARAMETERS nuiSmoothParams;
nuiSmoothParams.fCorrection = 0.3f;
nuiSmoothParams.fJitterRadius = 1.0f;
nuiSmoothParams.fMaxDeviationRadius = 0.5f;
nuiSmoothParams.fPrediction = 0.4f;
nuiSmoothParams.fSmoothing = 0.7f;
NuiTransformSmooth( &skeletonFrame, &nuiSmoothParams );
HRESULT hr;
hr = NuiSkeletonGetNextFrame(0, &skeletonFrame);
if ( FAILED(hr) )
{
return;
}
for (int i = 0 ; i < NUI_SKELETON_COUNT; ++i)
{
if(skeletonFrame.SkeletonData[i].eTrackingState == NUI_SKELETON_TRACKED)
{
float hand_r_z = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].z;
Vector4 v4RightHand = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT];
NuiTransformSkeletonToDepthImage( v4RightHand, &rightHandPos_X, &rightHandPos_Y );
if (hand_r_z!=0 )
{
printf("r X=%4.2f\n",rightHandPos_X);
}
else
{
NuiSkeletonGetNextFrame( 0, &skeletonFrame );
}
}
}
}
void KinectManager::calculateX(float x){
if(x <= 0){
}
}
Genauer gesagt kann man Problem auf folgende Zeilen
komprimiert werden:
NUI_SKELETON_FRAME skeletonFrame;
HRESULT hr = NuiSkeletonGetNextFrame(0, &skeletonFrame);
float rightHandPos_X,rightHandPos_Y;
Vector4 v4RightHand = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT];
NuiTransformSkeletonToDepthImage(v4RightHand, &rightHandPos_X, &rightHandPos_Y );
Ich habe zum Test immer nur die rechte Hand ausgeben lassen (Zeile 85).
Trotzdem sind die Pixelwerte nicht realistisch.
Ich weis auch nicht wo ich die Auflösung des Frames angeben soll.
Vielleicht kann mir jemand helfen?
Jeder Hinweis ist für mich Gold wert.
mfg,
bbklol