您的位置:首页 > 其它

Kinect V2 开发专题(2)项目配置与API概况

2016-09-13 16:58 387 查看
【原文:http://blog.csdn.net/bbdxf/article/details/44856713

Kinect V2 开发专题(2)

 

1、项目配置

2、Kinect API概况

 

 

1、项目配置

Kinect V2 版本SDK安装之后,默认会在环境变量中添加了一个叫做 KINECTSDK20_DIR 的环境变量,我们添加头文件和库时可以方便地直接使用。

在VS项目属性中,需要添加:

 

l C++目录 -> 头文件:$(KINECTSDK20_DIR)\inc;

l C++目录 -> 库文件:$(KINECTSDK20_DIR)\lib\x86; (64位的为x64)

l 连接器 -> 输入:Kinect20.lib

 

至此,在项目中引入头文件 #include “kinect.h”,就可以随意使用啦!

2、Kinect API 概况

近几年,微软对C++的发展真的是没做多大贡献,C++的native编程一再地收到冷漠对待,从新技术的参考文档就可以看出来。同样,官方给出的参考文档基本都是对应托管C++和C#,对于非托管的,虽然有接口表,但是说了和没说差不多了,不过好歹还是有的。

对于C#和托管C++请参考官方文档。这里由于自己需要使用非托管C++进行编程,所以,重点讨论这些内容。

 

首先,接口表和函数文档:https://msdn.microsoft.com/en-us/library/hh855364.aspx 。特别是接口表,很长一大串,似乎还没有一代的好用。但是,它确实比一代好用多了。我们这里做简要说明。

以下内容来源:http://blog.csdn.net/jiangfan2014/article/details/40760543

在Kinect 2.0中,每个类型的数据都有三个类与之对应:Source,Reader和Frame。比如如果要读取骨架,就有IBodyFrameSource, IBodyFrameReader, IBodyFrame这三个类,而要读取深度数据,就有IDepthFrameSource, IDepthFrameReader, IDepthFrame这三个类,以此类推其他的如Body Index,Infrared,Color数据也是这样命名的。

 

然后,这三个接口是什么关系呢?

 

1 Source

在我们初始化并打开了Kinect后,我们需要请求Kinect打开一个源,我们将从这个源不断获得信息。其代码为:

 

m_pKinectSensor->get_BodyFrameSource(&pBodyFrameSource);  

其中m_pKinectSensor是我们的Kinect总端口,pBodyFrameSource是一个IBodyFrameSource类。

 

2 Reader

由于Source是Kinect端拥有的,不是我们电脑拥有的,所以我们需要创建一个读口,这个读口和上述的源绑定,之后我们读取信息都通过调用这个Reader来获得。其代码为:

pBodyFrameSource->OpenReader(&m_pBodyFrameReader);  

其中m_pBodyFrameReader是一个IBodyFrameReader类。

 

3 Frame

Frame是真正存储数据的类,每一次都让Reader把数据读到Frame中,然后我们再从Frame中提取各种各样最后使用的数据。代码为:

m_pBodyFrameReader->AcquireLatestFrame(&pBodyFrame);  

其中pBodyFrame是一个IBodyFrame类。

 

4 如何从Frame中获得数据

请求Source和创建Reader对于每一个数据类型都是一模一样的,但是从Frame中提取信息则各有不同。下面讲讲深度信息、骨架信息、手势状态和人物二值图信息的提取方法。

 

4.1 深度信息:

在Kinect 2.0中,深度坐标空间的范围是(高*宽 = 424*512)(官网有说明)。从深度信息Frame中提取数据,主要就是把Frame中的数据转存到一个数组中(官网链接)。代码为:

pBodyIndexFrame->CopyFrameDataToArray(cDepthHeight*cDepthWidth, odyIndexArray);  

这里cDepthHeight是424,cDepthWidth是512,bodyIndexArray就是一个424*512大小的16位unsigned int数组,用来存储深度数据。 

 

4.2 骨架信息:

kinect 2.0可以同时追踪六个人的骨架,因此每次我们需要先调用函数,获得六个骨架信息(如果没有人,那么那个骨架类就是空指针)。代码为:

pBodyFrame->GetAndRefreshBodyData(_countof(ppBodies), ppBodies);  

 

这里ppBodies是一个长度为6的IBody数组,IBody是用来存储追踪到的骨架信息的类。 

在获得了这个类后,我们需要进一步从类中提取骨架位置,对于ppBodies中的每一个元素pBody,代码为:

pBody->GetJoints(_countof(joints), joints);  

 

这里的joints是一个长度为25的数组,每一个元素就是骨架的位置信息。然而, 这个骨架位置信息是照相机坐标系(camera view)下的位置,x和y的范围都是-1到1。因此我们需要将它转化到深度坐标系中。这里要用到一个coordinateMapper类,具体代码为:

m_pCoordinateMapper->MapCameraPointToDepthSpace(joints[j].Position, &depthSpacePosition[j]);  

coordinateMapper类的创建非常简单,具体可以参考代码。depthSpacePosition是一个长度也为25的数组,每一个元素是DepthSpacePoint,这个元素包含了在深度坐标系下的x和y坐标。 

 

最后,是否发现,我们通过这些对应关系很容易就能拿到我们需要的数据!哈哈,即便没发现也没关系,我们下一节进行更具体的开发。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: