5

我正在使用 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

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


编辑

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

4

4 回答 4

6

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

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

检查结果:

在此处输入图像描述

于 2012-09-04T02:37:07.597 回答
5

看起来他们显示的不是完整的点云,而是蓝色阴影强度图。这可以通过 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;
            }

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

在此处输入图像描述

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

希望能帮助大卫·贝茨

于 2012-07-01T21:33:30.957 回答
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)。

于 2012-06-13T22:30:05.987 回答
0

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

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

他们都做点云。

于 2012-06-14T00:35:02.100 回答