【问题标题】:Point-Cloud of Body Using Kinect SDK使用 Kinect SDK 的身体点云
【发布时间】:2012-06-16 23:02:16
【问题描述】:

我正在使用 SDK 制作一个程序,当检测到用户时,该程序会为他们绘制一个骨架。我最近在我的 Xbox 上看到了一款游戏广告,Nike+ Kinect,并看到它是如何显示角色的副本做其他事情的:

http://www.swaggerseek.com/wp-content/uploads/2012/06/fcb69__xboxkinect1.jpg

或者

http://www.swaggerseek.com/wp-content/uploads/2012/06/fcb69__xboxkinect.jpg

我可以为唯一检测到的人(不是任何背景)创建点云表示吗?提前致谢!


编辑

使用this site,我可以创建点云,但仍然无法围绕人的身体进行裁剪。

【问题讨论】:

    标签: c# wpf kinect point-clouds


    【解决方案1】:

    您可以对点进行非常简单的三角测量。 查看本教程:

    http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series1/Terrain_basics.php

    检查结果:

    【讨论】:

    • 非常好。你能发布实际的项目或者你是如何从深度映射到三角形的吗?本教程创建了一个静态网格,但不涉及映射。
    • 很简单。深度流中的每个像素都在一个顶点中,X 和 Y 是像素位置,Z 是深度。因此,使用该教程中的方法创建三角形的索引。
    • 这里是创建三角形的函数。它很脏的代码,je je。 paste.ideaslabs.com/show/wUQpbnvU5T
    • 非常好,正在试用。我从您的代码中注意到的一件事是,每次将深度流发送给它时,它都会构建顶点。这对性能有何影响,我知道向量很便宜,但这是一大堆,而且都是渲染软件方面。
    • 好吧,在我的旧电脑 CoreDuo 中,英特尔显卡运行良好。但可以肯定的是,您可以进行一些优化。
    【解决方案2】:

    看起来他们显示的不是完整的点云,而是蓝色阴影强度图。这可以通过 Kinect for Windows sdk 中的深度图像来完成。 您正在寻找的是玩家索引。这是深度图像的每个像素中提供的位。为了获得播放器索引位,您还必须在初始化代码中启用骨架流。

    所以我会这样做。我正在修改找到here 的 Kinect for Windows SDK 快速入门之一,将其加载并进行以下更改:

    //Change image type to BGRA32
    image1.Source = 
                    BitmapSource.Create(depthFrame.Width, depthFrame.Height, 
                    96, 96, PixelFormats.Bgra32, null, pixels, stride); 
    
            //hardcoded locations to Blue, Green, Red, Alpha (BGRA) index positions       
            const int BlueIndex = 0;
            const int GreenIndex = 1;
            const int RedIndex = 2;
            const int AlphaIndex = 3;
    
    //get player and depth at pixel
    int player = rawDepthData[depthIndex] & DepthImageFrame.PlayerIndexBitmask;
    int depth = rawDepthData[depthIndex] >> DepthImageFrame.PlayerIndexBitmaskWidth;
    
    //check each pixel for player, if player is blue intensity.
    
                if (player > 0)
                {
                    pixels[colorIndex + BlueIndex] = 255;
                    pixels[colorIndex + GreenIndex] = intensity;
                    pixels[colorIndex + RedIndex] = intensity;
                    pixels[colorIndex + AlphaIndex] = 100;
    
                }
                else
                {
                    //if not player make black and transparent
                    pixels[colorIndex + BlueIndex] = 000;
                    pixels[colorIndex + GreenIndex] = 000;
                    pixels[colorIndex + RedIndex] = 000;
                    pixels[colorIndex + AlphaIndex] = 0;
                }
    

    我喜欢使用这个示例来测试颜色,因为它仍然为您提供右侧的深度查看器。我在下面附上了这个效果的图片:

    左边的图像是带有轻微彩色像素级强度数据的强度图。

    希望有所帮助 大卫·贝茨

    【讨论】:

    • 考虑了像素级效果。您可以为每个其他像素增加强度,以便您可以获得示例图像上显示的闪光效果。只是说:)
    【解决方案3】:

    官方 Kinect SDK 无法自动实现这一点。但它是在称为 OpenNI 的替代 SDK 中实现的,在那里您可以获取用户组成的点集。如果您不想使用它,我可以建议将用户与背景分开的相当简单的方法。由于您知道用户的 z 位置,您可以只取 z 从 0 到 userZ 的点 + 一些代表身体厚度的值。

    另一个想法是从某个关节(或多个关节)开始越过点云,只有在距离变化平稳时才取点,因为如果取背景点、边界主体和下一个主体点,距离下降很容易被注意到。这里的问题是你将开始计算地板作为身体的一部分,因为那里的过渡是平滑的,所以你应该使用最低(脚踝)关节来验证它。

    或者您可以在 PCL (http://docs.pointclouds.org/trunk/group__segmentation.html) 中使用分段,但我不知道是否解决了脚底问题。看起来他们很擅长 (http://pointclouds.org/documentation/tutorials/planar_segmentation.php)。

    【讨论】:

    • @OutlawLemur for PCL 有教程链接。如果您决定自己实现它,就没有例子,这是有待解决的任务。
    【解决方案4】:

    Kinect for Windows SDK v1.5 有一个可以为此修改的示例。

    示例名称:depth-d3d 或 depthwithcolor-d3d。

    他们都做点云。

    【讨论】:

    • 不能帮助,但请注意这些都是 C++ 示例,我使用的是 C#
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多