使用Kinect SDK的身体点云

时间:2012-06-13 22:23:39

标签: c# wpf kinect point-clouds

我正在使用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,我可以创建点云,但仍然无法裁剪人体。

4 个答案:

答案 0 :(得分:6)

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

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

检查结果:

enter image description here

答案 1 :(得分:5)

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

所以这就是我要做的。我正在修改其中一个Kinect for Windows SDK快速入门here加载它并进行以下更改:

//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;
            }

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

enter image description here

左边的图像是具有略微颜色的像素级强度数据的强度图。

希望有所帮助 大卫贝茨

答案 2 :(得分:2)

使用官方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)。

答案 3 :(得分:0)

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

样品名称:depth-d3d或depthwithcolor-d3d。

他们都做点云。