【问题标题】:Joint tracking image on Skeletal Tracking not following correctlySkeletal Tracking 上的关节跟踪图像未正确跟随
【发布时间】:2012-11-30 08:40:02
【问题描述】:

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

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

        sensor.SkeletonStream.Enable();

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

【问题讨论】:

  • 您是否完全修改了代码(如果有,请包括在内)?您使用的是适用于 Windows 的 Kinect 还是 Xbox 369 Kinect?你的屏幕分辨率是多少?
  • 嘿@Evil Closet Monkey Windows 和 Xbox Kinect 在骨骼跟踪方面有什么不同吗?
  • 我不能 100% 确定是否有。 Xbox Kinect 不支持近距离模式,但这可能只是微软为了防止人们购买更便宜的版本(可能)而考虑的硬件开关。在线没有明确的细分可以涵盖两种硬件之间的所有技术差异。我只是试图捕捉原始项目和@user1773489 的项目之间的所有潜在差异,以查看可能导致问题的原因。
  • 我正在使用 Xbox 360 Kinect。 RGB 分辨率为 640x480。

标签: kinect


【解决方案1】:

尝试以下步骤。

  • 注释 scaleTo() 用于测试 porpose 的行。
  • 你用 640x480 初始化了 kinect?尝试将此尺寸放在 XAML 上的 my:KinectSkeletonViewer 元素中。我看到它实际上是 Width="320" Height="240",更改它。
  • 还要检查不要在您的 Image 元素或托管它的 Canvas 中使用拉伸,为了安全起见,请从 MainCanvas 中删除 Height="Auto" 和 Width="Auto"。
  • 使用 no 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( ),使用该方法,不用担心深度数据。

【讨论】:

  • 是的,我已经注释了所有 scaleTo() 代码行.....如果我保持转换为深度然后转换为颜色,可以吗?有没有办法检查 depth.Format 获得的格式分辨率?这可能是抵消的原因吗?当我运行我的代码时,我使用的椭圆图像位于我头部和手部位置之外的右上角。在视频中,图像就在手和头上。
  • 认为如果保持转换到Depht这不会造成问题,只是不必要的处理。我再次编辑了我的答案,您是否按照我的建议进行操作?它解决了你的问题?
  • 我已经应用了更改,我在上面的代码更新中显示了这些更改,但我仍然遇到问题。但是我也直接从 Kinect for Windows SDK 重新运行了一个干净的骨骼跟踪版本,它工作正常,所以它一定是我在我的原始代码中不知不觉地改变了一些东西,它基于 Kinect for Windows SDK 骨骼跟踪。
  • 酷,我建议你开始一个干净的项目,但我认为你不会想要:)
【解决方案2】:

看来我遇到的问题出在 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" />

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

【讨论】:

    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 2011-04-15
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多