首先说一下,本系统所使用的开发环境版本是计算机系统Windows 10、Visual Studio 2013、Opencv3.1.0和Kinect SDK v2.0。
vs2013需要vc12,如果VS版本更高的话可以使用较高版本的opencv,最好是vs、opencv版本一致,不然很容易出现问题。
Kinect sdk可直接从官网下载,OpenCV的配置方法和Kinect引入VS开发环境网上也有很多的资料,需要提一下的是,Kinect SDK v2.0下载下来后,双击安装就行,然后在VS2013里面添加一下相关的库目录和链接库的附加依赖项:
在【包含目录】中加入【$(KINECTSDK20_DIR)\inc】
在【库目录】中加入【$(KINECTSDK20_DIR)\Lib\x86】
在【链接器】的【输入】里,【附加依赖项】中加入【kinect20.lib】
其他的在这里就不多赘述,直奔主题,使用kinect sdk2.0和opencv获取人体骨骼数据并显示。
本文参考:博主baolinq
https://blog.csdn.net/baolinq/article/details/52356947
一、Kinect API介绍
既然要进行Kinect的开发,首先我觉得最好的方法是了解它的API,这部分相关的书籍和资料很少,比较靠谱的是各路大佬在CSDN发布的一些遇到过的坑或者相关总结,那些学习笔记和心得对开发还是很有帮助的。
其次最好的学习资料是SDK里面的示例程序(Samples),会发现Kinect的API都是有规律的,每个类型的数据都有三个类与之对应:Source,Reader和Frame,在程序里面只需要实例化这三个类并调用相关类的成员函数就可以了。比如要读取骨架,就有IBodyFrameSource, IBodyFrameReader, IBodyFrame这三个类,而要读取深度数据,就有IDepthFrameSource,IDepthFrameReader,IDepthFrame这三个类,以此类推其他的如Body Index,Infrared,Color数据也是这样命名的。
下面讲讲这三个接口的关系:
1、Source 在初始化好Kinect后,需要请求Kinect打开一个目标源,后面从这个源获得数据。以骨骼数据源为例,下同,示例代码为:
m_pKinectSensor->get_BodyFrameSource(&pBodyFrameSource);
其中m_pKinectSensor是一个IKinectSensor类的实例化对象,是Kinect的源,所有数据都是从这个源获取的,pBodyFrameSource是一个IBodyFrameSource类的实例化对象,它可以打开读口(reader)传输数据到电脑。
2、Reader 由于Source是从Kinect获得的数据源,在电脑端需创建一个Reader和上面的Source绑定,然后可以通过这个Reader来获取数据。示例代码:
pBodyFrameSource->OpenReader(&m_pBodyFrameReader);
其中m_pBodyFrameReader是一个IBodyFrameReader类的实例化对象,获取最新的图像帧(AcquireLatestFrame)以及该类数据的其他属性。
3、Frame 真正存储数据的类,一般是先从Reader读取数据到Frame里面,Frame里面有各种各样的数据,可以按自己的需求获取。示例代码:
m_pBodyFrameReader->AcquireLatestFrame(&pBodyFrame);
其中pBodyFrame是一个IBodyFrame类的实例对象,调用其相关成员函数就可以把数据转换到数组或者其他格式,进而可以用Opencv显示出来。
这里的每个对象都需主动释放,否则无法获取其他变量。
4、如何从Frame中获得数据
请求Source和创建Reader对于每一个数据类型都是一模一样的,但是从Frame中提取信息则各有不同。下面讲讲深度信息、骨架信息、手势状态和人物二值图信息的提取方法。<