【问题标题】:Kinect skeleton algorithm from depth images来自深度图像的 Kinect 骨架算法
【发布时间】:2016-05-18 22:01:29
【问题描述】:

我很好奇是否可以使用 Kinect 传感器的骨架算法。

更具体地说,我有一些深度图像,我想提取骨架。有可能吗?

【问题讨论】:

  • 你找到答案了吗?
  • 并非如此。除了 OpenNI 之外,我还没有检查该算法是否有良好的开源实现。

标签: kinect


【解决方案1】:

是的,有可能。

但很可能,这并不简单。

允许骨骼跟踪的算法称为“实时人体姿势识别部分来自单深度图像”。换句话说,它已经从一个单一的深度图像估计骨骼关节,这就是你所需要的。

使用 SDK(如 Microsoft 的 SDK 或您喜欢的任何其他 SDK)的优势在于您无需重新实现骨骼跟踪算法。事实上,它是相当复杂的,它也需要大量的训练数据来人工创建和正确使用。

但是,如果您想了解更多信息,可以在this page 上找到您需要的所有内容,其中有一个指向original paper 和一些supplementary material 的链接,用于构建用于实现的训练数据集算法。

【讨论】:

    【解决方案2】:

    要使用 Kinect 跟踪骨骼,您必须启用 SkeletonStream 并获取其中包含骨骼信息的帧(而不是从深度帧中获取信息。其中不存储任何骨骼信息)。

    首先,您必须在应用程序中启用骨架流,就像使用深度流或颜色流一样(我假设您理解这一点,因为您已经有了深度图像)。

    sensor.SkeletonStream.Enable(new TransformSmoothParameters() 
                {
                    Smoothing = 0.5f,
                    Correction = 0.5f,
                    Prediction = 0.5f,
                    JitterRadius = 0.5f,
                    MaxDeviationRadius = 0.04f
    
                });; // enable the skeleton stream, you could essentially not include any of the content in between the first and last curved brackets, as they are mainly used to stabilize the skeleton information (e.g. predict where a joint is if it disappears)
    
    skeletonData = new Skeleton[kinect.SkeletonStream.FrameSkeletonArrayLength]; // this array will hold your skeletal data and is equivalent to the short array that holds your depth data.
    
    sensor.SkeletonFrameReady += this.SkeletonFrameReady;
    

    那么你必须有一个方法,每次 Kinect 有一个骨架框架要显示(一个包含所有骨架信息的框架)时都会触发

    private void SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
    {
         using (SkeletonFrame skeletonFrame = e.SkeletonFrame()) //get all the skeleton data
         {
         if (skeletonFrame == null) //if there's no data, then exit
                {
                    return;
                }
    
                skeletonFrame.CopySkeletonDataTo(skeletonData); //copy all the skeleton data into our skeleton array. It's an array that holds data for up to 6 skeletons
    
                Skeleton skeletonOfInterest = (from s in skeletonData
                                  where s.TrackingState == SkeletonTrackingState.Tracked
                                  select s).ElementAtOrDefault(1); //define the first skeleton thats tracked
    
               //put code to manipulate skeletons. You have to go do some reading to find out how to work with the skeletons.
         }
    }
    

    MSDN 通常是我学习如何使用 Kinect 的转到资源。如果您安装了 Kinect SDK,Developer Toolkit Browser 中也有一些很好的示例。最后,另一个很好的资源是 Apress 的 Beginning Kinect Programming with the Microsoft Kinect SDK,我非常依赖它。你可以在Amazon找到它。

    【讨论】:

    • 感谢您的回答,但如果我能提供我自己存储的深度图像并使用骨架跟踪算法找到关节,我很感兴趣。从我搜索的内容来看,目前是不可能的。但我发现也许我可以用 OpenNI 来做到这一点。
    • 嗨@crow,你找到对深度图像进行骨骼分析的方法了吗?
    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多