Skeletal Tracking上的联合跟踪图像未正确跟踪

时间:2012-11-30 08:40:03

标签: kinect

当我运行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);

2 个答案:

答案 0 :(得分:2)

请尝试以下步骤。

  • 注释scaleTo()用于测试porposes的行。
  • 你用640x480初始化了kinect?尝试将此大小放在XAML上的my:KinectSkeletonViewer元素中。我看到它实际上是宽度=“320”高度=“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( ),使用该方法,不要担心深度数据。

答案 1 :(得分: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" />

这可能是我设置不正确的属性或事件设置,或者根本没有引入图像对象的移位。