2015-04-20 53 views
1

作为一个方面说明,这个问题与SharpDX无关,它纯粹是一个Kinect 2.0 SDK问题。Kinect v2相对光标位置

我将完成的Kinect 1.8项目迁移到Kinect 2.0 SDK。在这个程序中,我有一个WPF前端,但99%的代码是用SharpDX for 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来做到这一点(这正是我遇到这个问题的原因)。

+0

是否可以在Unity项目中使用该代码? –