处理深度数据 - Kinect

Posted

技术标签:

【中文标题】处理深度数据 - Kinect【英文标题】:Working with depth data - Kinect 【发布时间】:2011-11-10 17:32:58 【问题描述】:

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

但是,我无法理解在处理深度数据时如何使用位移和各种其他公式计算距离。

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

这些是文档等中解释的 Kinect 特定细节吗?任何帮助将不胜感激。

谢谢

【问题讨论】:

【参考方案1】:

像素深度

当您没有设置 kinect 来检测玩家时,它是一个简单的字节数组,两个字节代表一个深度测量值。

因此,就像在 16 位彩色图像中一样,每 16 位表示深度而不是颜色。

如果该数组用于假设的 2x2 像素深度图像,您可能会看到:[0x12 0x34 0x56 0x78 0x91 0x23 0x45 0x67] 表示以下四个像素:

AB
CD

A = 0x34 B = 0x78 C = 0x23 D = 0x67

<< 8 只是将该字节移动到 16 位数字的高 8 位。与乘以 256 相同。整个 16 位数字变为 0x3412、0x7856、0x2391、0x6745。你可以改为 A = 0x34 * 256 + 0x12。简单来说,这就像说我有 329 个项目和 456,000 个项目。如果我有这个项目总数,我可以将 456 乘以 1,000,然后将其添加到 329 以获得项目总数。 kinect 将整个数字分成两部分,您只需将它们加在一起即可。我可以将 456 向左“移动”3 个零位,这与乘以 1,000 相同。那么它将是 456000。所以对于 10 的整数,移位和乘法是相同的。在计算机中,2 的整数是相同的 - 8 位是 256,所以乘以 256 与左移 8 相同.

这将是您的四像素深度图像 - 每个生成的 16 位数字代表该像素的深度。

玩家深度

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

为了简化事情,忽略他们用来获取剩余13位深度数据的复杂方法,只做上面的事情,偷取低三位:

A = 0x34 B = 0x78 C = 0x23 D = 0x67

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 摆脱玩家后的深度。

如果您不需要播放器支持,至少在您的开发开始时,请跳过此步骤并使用第一种方法。但是,如果您确实需要玩家支持,这是获得它的众多方法之一。有更快的方法,但编译器通常会将上述除法和余数(模)运算转换为更有效的按位逻辑运算,因此您通常无需担心。

【讨论】:

非常感谢这个漂亮的解释!这确实完全解释了事情。我也很想知道这些细节是否真的在文档等的某个地方提到过? @Cipher 我对此表示怀疑。这种讨论被认为是低级的——视频中使用的方程是上述更优雅的形式。换句话说,制作文档和视频的开发人员假设使用 kinect 的程序员已经对 C 风格的数组表示、位移和位逻辑有深入的了解。随着时间的推移,你会学到很多这样的概念,这样的事情会变得更容易。

以上是关于处理深度数据 - Kinect的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Kinect 2.0 的深度数据转换为距离值?

kinect获取深度数据并显示

Processing中如何调整Kinect v2深度画面尺寸

如何缩放 kinect 深度图像以在 matlab 中应用 LBP?

如何提取kinect中深度图的点云数据

向量化 Kinect 真实世界坐标处理算法以提高速度