0

当我运行 Channel9 MSDN Kinect 快速入门系列代码进行骨骼跟踪时,假设有图像/椭圆与所选关节的位置重叠。相反,我得到的图像/椭圆稍微偏离了关节的位置,而不是完全超出了关节的位置。无论我将关节移动到哪里,图像都会远离关节的确切位置。我在这里看过视频(http://channel9.msdn.com/Series/KinectQuickstart/Skeletal-Tracking-Fundamentals)和他们的作品。是否有什么我做错了我没有注意到我改变或忘记更新的地方?

更新:这是可能导致它的一些代码行:

            CoordinateMapper cm = new CoordinateMapper(kinectSensorChooser1.Kinect);
            //Map a joint location to a point on the depth map
            //head
            DepthImagePoint headDepthPoint =
                cm.MapSkeletonPointToDepthPoint(first.Joints[JointType.Head].Position, depth.Format);

这是对视频内容的改变,因为他们更新了一种将骨架映射到深度和深度到色点的新方法。它消除了流终止时发生的错误。该方法具有要求位置和格式的参数。难道depth.Format与RGB640x480Resolution的格式不一样?

            //Map a depth point to a point on the color image
            //head
            ColorImagePoint headColorPoint =
                cm.MapDepthPointToColorPoint(depth.Format, headDepthPoint,
                ColorImageFormat.RgbResolution640x480Fps30);

在主窗口屏幕上,这是我创建正在使用的图像的内容:

<Canvas Name="MainCanvas">
    <my:KinectColorViewer Canvas.Left="50" Canvas.Top="50" Height="480" Name="kinectColorViewer1" Width="640" 
                          Kinect="{Binding ElementName=kinectSensorChooser1, Path=Kinect}" />
    <Ellipse Canvas.Left="0" Canvas.Top="0" Height="50" Name="leftEllipse" Width="50" Fill="#FF4D298D" Opacity="1" Stroke="White"></Ellipse>
    <Ellipse Canvas.Left="100" Canvas.Top="0" Height="50" Name="rightEllipse" Stroke="White" Width="50" Fill="#FF2CACE3" Opacity="1" />
    <my:KinectSensorChooser Canvas.Left="250" Canvas.Top="380" Name="kinectSensorChooser1" Width="328" />
    <Ellipse Canvas.Left="225" Canvas.Top="84" Height="50" Name="headImage" Stroke="White" Width="50" Fill="#FF2CACE3" Opacity="1" />
    <my:KinectSkeletonViewer Canvas.Left="646" Canvas.Top="240" Name="kinectSkeletonViewer1" Width="640" Height="480" Kinect="{Binding ElementName=kinectSensorChooser1, Path=Kinect}" />

</Canvas>

我已经评论了这些关于缩放位置的代码行

        //ScalePosition(headImage, first.Joints[JointType.Head]);
       // ScalePosition(leftEllipse, first.Joints[JointType.HandLeft]);
        //ScalePosition(rightEllipse, first.Joints[JointType.HandRight]);

并且此功能已被评论。

    private void ScalePosition(FrameworkElement element, Joint joint)
    {
        //convert the value to X/Y
        //Joint scaledJoint = joint.ScaleTo(1280, 720); 

        //convert & scale (.3 = means 1/3 of joint distance)
       // Joint scaledJoint = joint.ScaleTo(1280, 720, .3f, .3f);

    //    Canvas.SetLeft(element, scaledJoint.Position.X);
      //  Canvas.SetTop(element, scaledJoint.Position.Y);

    }

这已被注释掉,因此不使用任何变换参数: //sensor.SkeletonStream.Enable(parameters);

这就是启用流和骨架的代码行的样子:

        sensor.SkeletonStream.Enable();

        sensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(sensor_AllFramesReady);
        sensor.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
        sensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
4

2 回答 2

2

尝试以下步骤。

  • 注释 scaleTo() 用于测试的行。
  • 你用 640x480 初始化了 kinect?尝试将此尺寸放在 XAML 上的 my:KinectSkeletonViewer 元素中。我看到它实际上是 Width="320" Height="240",更改它。
  • 还要检查不要在您的 Image 元素或托管它的 Canvas 上使用 strech,为了安全起见,请从 MainCanvas 中删除 Height="Auto" 和 Width="Auto"。
  • 在没有TransformSmoothParameter 的情况下启动您的骨架流,或者,如果您想使用它,请尝试以下参数

    this.KinectSensorManager.TransformSmoothParameters = new TransformSmoothParameters
    {
        Smoothing = 0.5f,
        Correction = 0.5f,
        Prediction = 0.5f,
        JitterRadius = 0.05f,
        MaxDeviationRadius = 0.04f
    };
    

我正在尝试使用 kinect for xbox 做同样的事情,它对我来说效果很好。录制channel9视频时sdk没有CoordinateMapper类,所以不需要先转深度再转颜色,坐标映射器有直接将骨架点映射到色点的方法,方法是MapSkeletonPointToColorPoint( ),使用该方法,不用担心深度数据。

于 2012-11-30T16:01:34.680 回答
0

看起来我遇到的问题出在 xaml 代码中。我替换了我拥有的 xaml 代码,并将其替换为画布上图像和对象的原始 xaml 代码。

    <my:KinectColorViewer Canvas.Left="0" Canvas.Top="0" Width="640" Height="480" Name="kinectColorViewer1" 
                          Kinect="{Binding ElementName=kinectSensorChooser1, Path=Kinect}" />
    <Ellipse Canvas.Left="0" Canvas.Top="0" Height="50" Name="leftEllipse"  Width="50" Fill="#FF4D298D" Opacity="1" Stroke="White" />
    <Ellipse Canvas.Left="100" Canvas.Top="0" Fill="#FF2CACE3" Height="50" Name="rightEllipse" Width="50" Opacity="1" Stroke="White" />
    <my:KinectSensorChooser Canvas.Left="250" Canvas.Top="380" Name="kinectSensorChooser1" Width="328" />
    <Image Canvas.Left="66" Canvas.Top="90" Height="87" Name="headImage" Stretch="Fill" Width="84" Source="/SkeletalTracking;component/c4f-color.png" />

可能是我设置不正确或根本没有设置的属性或事件设置导致图像对象发生变化。

于 2012-12-03T00:16:26.573 回答