Kinect v2相对光标位置

时间:2015-04-20 15:03:52

标签: c# cursor kinect

作为旁注,这个问题与SharpDX无关,它纯粹是一个Kinect 2.0 SDK问题。

我正在将已完成的Kinect 1.8项目迁移到Kinect 2.0 SDK。在这个程序中,我有一个WPF前端,但99%的代码是用SharpDX for C#编写的。程序隐藏KinectRegions光标并使用光标位置和夹点数据作为SharpDX代码的输入。然而,使用这个新版本的Kinect SDK,我找不到任何方法来获取相对光标数据(相对于用户的手位置)。我尝试使用骨架数据来推断光标位置,只是一个简单的主肩位置 - 主手位置。这有一个问题,当手遮住肩膀时,光标会射击。如果我在遮挡发生时通过脊柱反射来切换肩膀,我会瞬间跳跃。我可以想办法让它工作,但需要相当多的代码。在我深入研究之前,我想确保没有别的办法。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分: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做到这一点(这让我对这个问题实际上大笑)。