浅谈KINECT FOR WINDOWS SDK之深度数据
马老师的Kienct系列写的很不错,等他的Depth Data也等了好几天了,不见其更新。于是自己在空闲时间研究了下。特发此文,与各位园友分享。
如果您对Kinect for Windows开发不了解的话,建议您点击下马老师的博客,或者观看相关视频进行了解。
在C#中,获得Depth Data有两种方式。当然大家最喜欢用的是基于事件的这一种。
Runtime nui =
new
Runtime();
private
void
Window_Loaded(
object
sender, RoutedEventArgs e)
{
nui.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking);
nui.DepthFrameReady +=
new
EventHandler<ImageFrameReadyEventArgs>(DepthFrameReady);
nui.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex);
}
void
DepthFrameReady(
object
sender, ImageFrameReadyEventArgs e)
{
}
|
在这里,我们只讨论基于RuntimeOptions.UseDepthAndPlayerIndex的景深数据。
在ImageFrameReadyEventArgs中返回了一个ImageFrame类实例,ImageFrame类中包含了PlanarImage类,PlanarImage中包含了一个Bits属性。它是一个bytes数组。
这个数组包含了每一个像素的数据信息。其规则是,从左到右,从上到下。
数组中每一项包含了距离和PlayerIndex信息(这是仅仅基于RuntimeOptions.UseDepthAndPlayerIndex的景深数据,其他类型的枚举可能不包括PalyerIndex数据)
数组中每一项包含2个byte,总计16 bit
低位的后3位是PlayerIndex的数据,理论上,应该支持2^3个PlayerIndex,可是Kinect最多可达6个可能的值,目前仅支持3个。
其余的13位就是景深数据,在计算距离时,要移掉后面3位,高位要左移5位,然后相加或者取或运算。
公式为:Bytes[1] * 2^5 + Bytes[0] / 2^3(右移3位,相当于除以2^3,一定要取整)
那么理论上支持最大的距离是8192毫米,即8.192米。
当然,公式也可以这样写:Bytes[0] >> 3 | Bytes[1] << 5
OK,就写到这里了,我的理解是这样的,如果我的理解有什么问题,欢迎提出来。