我刚开始通过一些快速启动视频了解Kinect,并尝试使用深度数据处理代码。
但是,我无法理解如何使用位移以及在处理此深度数据时用于计算其他内容的各种其他公式来计算距离。
http://channel9.msdn.com/Series/KinectSDKQuickstarts/Working-with-Depth-Data
这些是在文档等中解释的Kinect特定细节吗?任何帮助将不胜感激。
由于
答案 0 :(得分:13)
当你没有设置kinect来检测播放器时,它只是一个字节数组,有两个字节代表一个深度测量。
因此,就像在16位彩色图像中一样,每16位代表深度而不是颜色。
如果阵列用于假想的2x2像素深度图像,您可能会看到:[0x12 0x34 0x56 0x78 0x91 0x23 0x45 0x67],它代表以下四个像素:
AB
CD
A = 0x34<< 8 + 0x12
B = 0x78<< 8 + 0x56
C = 0x23<< 8 + 0x91
D = 0x67<< 8 + 0x45
<< 8
只是将该字节移动到16位数的高8位。它与乘以256相同。整个16位数字变为0x3412,0x7856,0x2391,0x6745。你可以改为A = 0x34 * 256 + 0x12。简单来说,就像说我有329件商品和456千件商品。如果我有这些项目,我可以将456乘以1,000,并将其添加到329以获得项目总数。 kinect将整个数字分成两部分,你只需将它们加在一起即可。我可以将456向左移动3个零位,这与乘以1,000相同。那么它将是456000.所以移位和乘法对于整数10都是相同的。在计算机中,2的总量是相同的 - 8位是256,所以乘以256与向左移动8相同
这将是您的四像素深度图像 - 每个得到的16位数字代表该像素的深度。
当您选择显示播放器数据时,它会变得更有趣。整个16位数字的最后三位告诉你该号码所属的玩家。
为简化起见,忽略用于获取剩余13位深度数据的复杂方法,并执行上述操作,并窃取低三位:
A = 0x34&lt;&lt; 8 + 0x12
B = 0x78&lt;&lt; 8 + 0x56
C = 0x23&lt;&lt; 8 + 0x91
D = 0x67&lt;&lt; 8 + 0x45
Ap = A%8
Bp = B%8
Cp = C%8
Dp = D%8
A = A / 8
B = B / 8
C = C / 8
D = D / 8
现在像素A具有玩家Ap和深度A. %
得到除法的余数 - 所以取A,除以8,其余为玩家数。分裂的结果是深度,剩余部分是玩家,所以A现在包含深度,因为我们摆脱了A = A / 8的玩家。
如果您不需要玩家支持,至少在开发开始时,请跳过此步骤并使用第一种方法。但是,如果你确实需要玩家支持,这是获得它的众多方法之一。有更快的方法,但编译器通常会将上面的除法和余数(模数)运算转换为更有效的按位逻辑运算,因此通常不需要担心它。