处理深度数据 - Kinect

9

我刚开始通过一些快速入门视频了解Kinect,试着使用代码处理深度数据。

但是,我无法理解如何使用位移和其他公式计算距离,同时在处理这个深度数据时还涉及到其他的计算方式。

http://channel9.msdn.com/Series/KinectSDKQuickstarts/Working-with-Depth-Data

这些是否是在文档等中详细说明了与Kinect相关的具体信息?任何帮助将不胜感激。

谢谢!

1个回答

13

像素深度

如果你没有设置Kinect来检测玩家,它就只是一个字节数组,每两个字节代表一个深度测量。

就像在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乘以1000,然后加上329,以获得物品的总数量。Kinect已将整个数字分成两个部分,你只需要将它们相加即可。我可以通过在左侧"移动"456三个零位,也就是乘以1000来实现。那么结果就是456000。因此,对于10的整数倍,shift和乘法是相同的。在计算机中,2的整数幂也是相同的-8位是256,因此乘以256等同于左移8位。

这将是您的四像素深度图像-每个结果为16位的数字表示该像素的深度。

玩家深度

当您选择显示玩家数据时,它会变得更加有趣。整个16位数字的底部三位告诉您该数字属于哪个玩家。

为简化问题,请忽略他们用于获取剩余13位深度数据的复杂方法,只需按上述方式操作并使用较低的三位:

A = 0x34 << 8 + 0x12
B = 0x78 << 8 + 0x56
C = 0x23 << 8 + 0x91
D = 0x67 << 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/8来消除玩家,现在A包含深度。
如果您在开发开始时不需要玩家支持,请跳过此方法,只使用第一种方法。但是,如果您确实需要玩家支持,这是其中之一。有更快的方法,但编译器通常会将上述除法和余数(模数)操作转换为更有效的位逻辑操作,因此通常无需担心。

非常感谢您这次的清晰解释!那肯定完全解释了事情。我还很想知道这些细节是否实际上在文档等地方有提到? - Cipher
@Cipher 我有所怀疑。这种讨论被认为是低级的 - 视频中使用的方程式是上述方程式的更优雅形式。换句话说,制作文档和视频的开发人员假定使用kinect的程序员已经对C样式数组表示、位移和位逻辑有了扎实的理解。随着时间的推移,你会掌握很多这些概念,这种事情会变得更容易。 - Adam Davis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接