Kinect V2 开发专题(2)项目配置与API概况
来源:互联网 发布:淘宝联盟——我的舞台 编辑:程序博客网 时间:2024/06/06 01:59
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坐标。
最后,是否发现,我们通过这些对应关系很容易就能拿到我们需要的数据!哈哈,即便没发现也没关系,我们下一节进行更具体的开发。
- Kinect V2 开发专题(2)项目配置与API概况
- Kinect V2 开发专题(2)项目配置与API概况
- Kinect V2 开发专题(1)软硬件需求与安装测试
- Kinect V2 开发专题(3)设备信息获取与音频功能探索
- Kinect V2 开发专题(1)软硬件需求与安装测试
- Kinect V2 开发专题(3)设备信息获取与音频功能探索
- Kinect V2开发(2)从Kinect获取数据
- Kinect V2 开发专题(4)骨骼/深度/红外/摄像头数据获取
- Kinect V2 开发专题(5)坐标映射/人脸识别/语音 - (未完成)
- Kinect V2 开发专题(4)骨骼/深度/红外/摄像头数据获取
- Kinect V2开发(3)用OpenCV显示Kinect图像
- Kinect V2开发(4)抠图
- C# kinect v2学习笔记(一) kinect V2配置安装
- Kinect V2 开发环境搭建
- Kinect V2开发(1)入门
- VS2015下VOpenCV3.2 +Kinect V2 环境配置
- 游戏开发计划——开发模式与项目概况
- Kinect V2开发(5)读关节数据
- CGContextRef用法
- 乱序的序列保序输出
- ArcGIS中标注(label)的使用技巧
- Android Studio创建项目
- Nativescript学习遇到的一些问题
- Kinect V2 开发专题(2)项目配置与API概况
- myAche
- jdbc技术(一)
- 再谈高级面向对象编程之抽象类和方法
- 冒泡排序算法
- 初识Hadoop
- 按照范围过滤所使用的类是Lucene的RangeFilter
- mp4 文件格式系列
- Android通过NDK获取Keystore签名值 .