尝试读取Kinect SkeletonFrame变量中的单个元素时出现问题

时间:2014-03-19 03:14:07

标签: c# sdk kinect

我们一直在努力使用Kinect教程大约一个月,虽然我们已经将大部分代码从Beta2更新到v1.8,但是有一个逻辑错误,我们没有修复的知识或理解。

基本上,一个小循环试图读取skeletonSet变量中的每个单独元素,但是我们不断收到错误消息“无法找到源类型'Microsoft.Kinect.SkeletonFrame'的查询模式的实现。” “没找到”。

void runtime_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            SkeletonFrame skeletonSet = e.OpenSkeletonFrame();

            Skeleton data = (from s in skeletonSet // <- Here is the error
                             where s.TrackingState == SkeletonTrackingState.Tracked
                             select s).FirstOrDefault();
            if (data != null)
            {
                SetEllipsePosition(Head, data.Joints[JointType.Head]);
                SetEllipsePosition(leftHand, data.Joints[JointType.HandLeft]);
                SetEllipsePosition(rightHand, data.Joints[JointType.HandRight]);
                ProcessGesture(data.Joints[JointType.Head], data.Joints[JointType.HandLeft], data.Joints[JointType.HandRight]);
            }     

        }

有没有人知道SkeletonFrame变量的解决方案或解释,以及什么会阻止此代码工作?

1 个答案:

答案 0 :(得分:0)

您不应直接使用SkeletonFrame - 使用方法CopySkeletonDataTo将骨架数据复制到Skeletons数组中。之后,您可以使用骨架数组。并且不要忘记丢弃你打开的SkeletonFrame。

<强> 1。在类中定义一个将接收骨架数据的字段:

private Skeleton[] mySkeletons;

<强> 2。打开SkeletonFrame并复制骨架数据

    private void OnSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
    {
        bool haveSkeletons = false
        using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
        {
            if (null != skeletonFrame)
            {
                if ((null == mySkeletons) || (mySkeletons.Length != skeletonFrame.SkeletonArrayLength))
                {
                    mySkeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
                }
                skeletonFrame.CopySkeletonDataTo(mySkeletons);
                haveSkeletons = true;
            }
        }

第3。使用复制的骨架数据

       if (haveSkeletons)
       {
          Skeleton data = (from s in mySkeletons
             where s.TrackingState == SkeletonTrackingState.Tracked
             select s).FirstOrDefault();
       }
   }