Kinect V2开发(2)从Kinect获取数据
在Kinect for windows SDK2.0中,Kinect有多种类型的数据源,每个类型的数据都有三个类与之对应:Source,Reader和Frame。要读取骨架,就有IBodyFrameSource, IBodyFrameReader, IBodyFrame这三个类,要读取深度数据,就有IDepthFrameSource, IDepthFrameReader, IDepthFrame这三个类,以此类推其他的如Body Index,Infrared,Color数据也是这样命名的。
在Kinect for windows SDK2.0中,获取并处理数据源接口步骤如下:
Sensor -> Source -> Reader -> Frame -> Data
1.Sensor
GetDefaultKinectSensor()
这个函数用来获取预设的感应器,括号里填自己的预设名字就可以,然后就可以设置传感器的状态。
eg:
GetDefaultKinectSensor(&IKinectSensor); //获取感应器
IKinectSensor->Open(); //打开感应器
2.Source
在IKinectSensor下,有这样一些函数成员,通过调用它们,可以获取相应的数据。
IKinectSensor (对应到感应器)
get_DepthFrameSource() -> IDepthFrameSource (深度图像来源)
get_ColorFrameSource() -> IColorFrameSource (彩色图像来源)
get_InfraredFrameSource() -> IInfraredFrameSource (红外图像来源)
get_AudioSource() -> IAudioSource (声音来源)
get_BodyFrameSource() -> IBodyFrameSource (人体骨架信息来源)
get_BodyIndexFrameSource() -> IBodyIndexFrameSource (人体在深度图像中的位置信息来源)
……
以source结尾的,都是数据的来源,我们并不能直接使用这些数据,需要通过另外的函数读取。
3.Reader
通过 OpenReader()’ 这样一个函数,我们可以取得对应的 ’ Frame Reader’ 来读取数据
以IColorFrameSource为例,我们可以通过OpenReader()函数取得IColorFrameReader,并通过它来读取数据。
4.Data
通过AcquireLatestFrame(),我们可以获取最新的数据,并且装入另一个数据帧里,但是这个函数必须要判断是否返回一个成功值,因为获取失败的几率非常高。
以IColorFrameReader为例,获取到的最新数据保存至IColorFrame中
5.数据处理
读取到数据帧后,我们通过AccessUnderlyingBuffer()这个函数将数据复制到数组,这个函数有两个参数,第一个是个记录大小的变量,第二个是个接受数据的数组指针,传入后会分别返回数组的大小以及数据。它传入数组的数据代表的是那一个像素点上的物体距离传感器的位置。
我们也可以通过get_FrameDescription()描述彩色数据帧的具体信息
总结来说,流程如下
- GetDefaultKinectSensor() → IKinectSensor
- get_ColorFrameSource() → IColorFrameSource
- OpenReader() → IColorFrameReader
- AcquireLatestFrame() → IColorFrame
获取到数据之后就可以进行后续的数据处理啦~
参考资料
官方文档:介绍接口、函数以及Kinect结构等
Kinect for Windows C++ Reference
Heresy博客
Kinect for Windows SDK v2 C++ API 簡介
下一篇: Kinect获取彩色图像