使用Kinect SDK的身体点云

我正在使用SDK创建一个程序,当检测到用户时,该程序会绘制一个框架供他们遵循。 我最近在我的Xbox, Nike + Kinect上看到了一个广告,并看到它如何显示该角色的副本,如:

http://sofzh.miximages.com/c%23/fcb69__xboxkinect1.jpg

要么

http://sofzh.miximages.com/c%23/fcb69__xboxkinect.jpg

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


编辑

使用这个网站 ,我可以创建点云,但仍然无法裁剪人的身体。

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

所以我就是这样做的。 我正在修改其中一个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; } 

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

在此处输入图像描述

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

希望能帮助大卫贝茨

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

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

检查结果:

在此处输入图像描述

使用官方Kinect SDK无法自动执行此操作。 但它是在名为OpenNI的替代SDK中实现的,您可以在其中获取用户所包含的点集。 如果您不想使用它,我可以建议将用户与背景分离的相当简单的方法。 由于您知道用户的z位置,您可以只取z从0到userZ的点数+表示体厚度的某个值。

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

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

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

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

他们都做点云。