我刚开始通过一些快速入门视频了解Kinect,试着使用代码处理深度数据。
但是,我无法理解如何使用位移和其他公式计算距离,同时在处理这个深度数据时还涉及到其他的计算方式。
http://channel9.msdn.com/Series/KinectSDKQuickstarts/Working-with-Depth-Data
这些是否是在文档等中详细说明了与Kinect相关的具体信息?任何帮助将不胜感激。
谢谢!
我刚开始通过一些快速入门视频了解Kinect,试着使用代码处理深度数据。
但是,我无法理解如何使用位移和其他公式计算距离,同时在处理这个深度数据时还涉及到其他的计算方式。
http://channel9.msdn.com/Series/KinectSDKQuickstarts/Working-with-Depth-Data
这些是否是在文档等中详细说明了与Kinect相关的具体信息?任何帮助将不胜感激。
谢谢!
如果你没有设置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除以8,余数就是玩家编号。除法的结果是深度,余数是玩家,所以通过A=A/8来消除玩家,现在A包含深度。