2015-04-20 2 views
1

В качестве побочного примечания этот вопрос не имеет ничего общего с SharpDX, это вопрос Kinect 2.0 SDK.Kinect v2 Относительное расположение курсора

Я переношу завершенный проект Kinect 1.8 в Kinect 2.0 SDK. В этой программе у меня есть интерфейс WPF, но 99% кода написано в SharpDX для C#. Программа скрывает курсор KinectRegions и использует расположение курсора и данные захвата в качестве входа в код SharpDX. Однако с этой новой версией Kinect SDK я не могу найти способ получить относительные данные курсора (позиция руки относительно пользователя). Я попытался использовать данные скелета, чтобы экстраполировать местоположение курсора, просто простую основную позицию плеча - местоположение первичной руки. Это связано с тем, что рука закрывает плечо, курсор стрелял. Если я переключаю плечи, отражая поперек позвоночника, когда происходит окклюзия, я получаю мгновенный прыжок. Я могу придумать способ заставить это работать, но это займет совсем немного кода. Я хочу убедиться, что нет другого пути, прежде чем погрузиться в это. Заранее благодарю за любую помощь!

ответ

0

Вы должны зарегистрироваться Mike Taulty's blog. Он использует KinectCoreWindow, чтобы захватить движение указателя. Однако следует отметить осторожность: это событие поднимается для обеих рук, даже если они не являются «активными». Я смягчил это, используя рамку тела, чтобы установить, какая рука была выше (y), чтобы обозначить, что эта рука была «активной».

... 
var window = KinectCoreWindow.GetForCurrentThread(); 
window.PointerMoved += window_PointerMoved; 
... 

void window_PointerMoved(object sender, KinectPointerEventArgs e) 
{ 
    if ((!rightHand && e.CurrentPoint.Properties.HandType == HandType.LEFT) || 
     (rightHand && e.CurrentPoint.Properties.HandType == HandType.RIGHT)) 
    { 
     //do something with this hand pointer's location 
    } 
} 

void _bodyReader_FrameArrived(object sender, BodyFrameArrivedEventArgs e) 
{ 
    //get and check frame 
    //... 

    using (frame) 
    { 
     frame.GetAndRefreshBodyData(_bodies); 
     foreach(Body body in _bodies) 
     { 
      if(body.IsTracked) 
      { 
       CameraSpacePoint left = body.Joints[JointType.HandLeft].Position; 
       CameraSpacePoint right = body.Joints[JointType.HandRight].Position; 

       if (left.Y > right.Y) 
        rightHand = false; 
       else 
        rightHand = true; 

       break; //for this example I'm just looking at the first 
         //tracked body - other handling is required if you 
         //want to keep track of more than one body's hands 
      } 
     } 
    } 
} 

Другая часть состоит в том, что ваше предыдущее приложение могло скрыть курсор KinectRegion; Я еще не узнал, как это сделать с Kinect v2 (что и привело меня к этому вопросу на самом деле lol).

+0

Можно ли использовать этот код в проекте Unity? –

Смежные вопросы