我正在使用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,我可以创建点云,但仍然无法裁剪人体。
答案 0 :(得分:6)
你可以对点进行非常简单的三角测量。 查看本教程:
http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series1/Terrain_basics.php
检查结果:
答案 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;
}
我喜欢使用此示例来测试颜色,因为它仍然为您提供右侧的深度查看器。我在下面附上了这种效果的图像:
左边的图像是具有略微颜色的像素级强度数据的强度图。
希望有所帮助 大卫贝茨
答案 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。
他们都做点云。