前言
- 记录自己在微软官网学习Kinect SDK V2的一些思考看法和一些使用这个SDK很重要的关键点;
- 本人的SDK使用以及OpenCV环境的搭建的研究背景是改进Kinect的人体骨骼数据识别算法;
- 有一些新的思考也会及时加入这篇文章中。
SDK中的函数返回值
- SDK中的所有的函数返回值都是HRESULT,它是用来表示函数执行状态的,如果成功则返回 S_OK;否则,返回失败代码。
- 也就是说函数返回的并不是操作的相关对象,而是方法执行状态是否正确。
- 想对一些数值或者物体做修改,只能把数值或物体当作引用参数传入相关函数,让函数去修改它原本的值。也就是说所有的函数参数列表中都需要使用引用符号
&
,这是特别重要的一点!这是一个我们使用SDK V2贯穿全过程的一个基本思想,可能和我们平时写代码的思想不一样,这一点我们需要去适应它。
- 这是一个拿到Kinect传感器指针的示例
IKinectSensor* pSensor = nullptr;
if (GetDefaultKinectSensor(&pSensor) != S_OK)
{
cerr << "Get Sensor failed" << endl;
return -1;
}
如何拿到最终的数据
- 利用函数
GetDefaultKinectSensor()
→IKinectSensor
得到Kinect这个传感器的指针后,我们依次需要经过 Source ->Reader -> Frame三个方法才能最终拿到数据;
- 通过IKinectSensor的成员方法,获取资料来源Frame Srouce;例如
IDepthFrameSource
- 针对资料来源物件,利用其成员函数取得资料读取器 Frame Reader;例如
IDepthFrameReader
- 不断通过资料读取器,去读取相应的资料 Frame;例如
IDepthFrame
(需检查资料是否读取成功,若成功就对读取到的资料进行处理)
- 同时以上这些物件使用之后都及时释放资源,如
pFrameSource->Release();
pFrameSource = nullptr;
两种操作模式
在资料读取的架构上,SDK提供了两种操作模式,
- 事件导向 event
- 轮询 polling
对所有获取Kinect数据的流程进行总结
大部分对Kinect的操作都是需要通过 IKinectSenor
这个接口开始操作的,然后->Open()
打开传感器,定义相应的Srouce接口 I
开头令其为空指针 nullptr
,用传感器get_***Source()
得到Srouce,然后再用Srouce->OpenReader()
得到Reader,用Reader-> AcquireLatestFrame
得到最终的数据 Frame ,有了Frame我们就可以根据API获取到对应的数据了,每个Frame都有自己的独特方法,需要看具体API进行操作。
Kinect中的三种坐标系及相互转换的方法
- 通过官网的C++ Reference我们可以看到在Kinect一共有三种坐标系,分别是
CameraSpacePoint
、DepthSpacePoint
、ColorSpacePoint
,其中只有CameraSpacePoint
是三维坐标,剩下的都是以二维坐标存储着。
typedef struct _CameraSpacePoint {
float X;
float Y;
float Z;
} CameraSpacePoint;
- 当我们需要对不同坐标转换时,SDK有提供相应的坐标转换器,这三者之间可以实现互相转换,通过Kinect传感器,我们就可以得到一个
CoordinateMapper
坐标转换器了。
ICoordinateMapper* pCoordinateMapper = nullptr;
if (pSensor->get_CoordinateMapper(&pCoordinateMapper) != S_OK)
{
cout << "Can't get coordinate mapper" << endl;
return -1;
}
- 然后我们就可以使用其相应方法,来进行坐标转换了
Kinect SDK V2在Visual Studio 2019中的环境配置
在官网下载好了SDK V2之后,我们还要在具体代码中进行配置,让环境能够找到相应的库函数和头文件。这里以Visual Studio 2019为例进行环境配置.
-
首先,新建个项目,然后在【解决方案资源管理器】中右键项目名,选择【属性】
-
在【C/C++】的【常规】里,【附加包含目录】中加入【$(KINECTSDK20_DIR)\inc】
-
在【链接器】的【常规】里,【附加库目录】中加入【$(KINECTSDK20_DIR)\Lib\x64】
-
在【链接器】的【输入】里,【附加依赖项】中加入【kinect20.lib】
OpenCV在Visual Studio 2019中的环境配置
- 使用Kinect进行项目开发时,很有可能需要用到OpenCV进行一些机器视觉方面的函数处理。这边同时也记录下自己在IDE上部署OpenCV环境的配置过程。
OpenCV(全称Open Source Computer VisionLibrary)是一个开源的计算机视觉库,它可以用于实时图像处理、计算机视觉、机器学习和深度学习等应用。OpenCV最初是由英特尔公司开发,现在已经成为了一个由开源社区维护的跨平台计算机视觉库,支持各种平台(Windows、Linux、MacOS等)和编程语言(C++、Python、Java等)。
OpenCV提供了大量的图像处理和计算机视觉算法,包括图像滤波、边缘检测、形态学操作、特征检测、特征匹配、目标跟踪、人脸识别、物体识别等。它还支持图像和视频的读取、显示和保存,可以方便地与其他开源库集成,如NumPy、SciPy和Matplotlib等。
OpenCV的优点包括易于使用、高效、跨平台、支持多种编程语言、具有丰富的算法和工具库等。因此,它在计算机视觉和图像处理领域得到了广泛的应用,包括机器人技术、自动驾驶、安防监控、医学影像、工业检测等多个领域
- 环境变量配置 ,在系统变量中将OpenCV对应的bin路径加入到【PATH】中
D:\OpenCV\opencv\build\x64\vc15\bin
- 右键点开项目的【属性页】,然后找到【VC++目录】,在【包含目录】中输入以下内容
D:\OpenCV\opencv\build\include\opencv2
D:\OpenCV\opencv\build\include\opencv2
- 添加【库目录】,输入【D:\OpenCV\opencv\build\x64\vc15\lib】
- 在【链接器】的【常规】中,找到【附加依赖项】,输入【opencv_world460d.lib】(460是opencv相应版本号的缩写)
Opencv拓展模块安装opencv_contrib
在进行骨架细化的时候才发现opencv自身是没有【opencv2/ximgproc.hpp】这个头文件配置的,上网查了才发现原来还需要额外安装一个opencv_contrib,而且比安装opencv还要麻烦,还需要用到cmake对其文件进行编译。
软件下载
- 首先在cmake官网下载最新版
- 然后在opencv官网下载和opencv版本相符的opencv_contrib
下载完之后解压到opencv目录下就行,然后还需要在opencv目录下新建一个文件夹【bulid_new】用来存放contrib编译后的文件
文件编译
- 打开cmake开始编译文件
- 在where is the source code中选择openCV的源代码目录:【D:\OpenCV\opencv\sources】
- 在where to build the binaries中选择编译后文件存放的目录:【D:\OpenCV\opencv\build_new】
- 然后直接点【Configure】等待一段时间后(挺久的其实)
- 在cmake搜索框中搜索OPENCV_EXTRA_MODULES_PATH,将其值选择为opencv_contrib目录中的modules目录,此时就可以看到cmake里面的红色部分消失了。
- 最后,单击【Generate】进行编译,显示“Generate down”表示编译完成。
重新生成解决方案
- 重新生成解决方案
- 在new_build目录中找到【OpenCV.sln】,用visual2019打开,然后切换到Debug模式下
- 在解决方案中选中项目,右键选择重新生成解决方案
- 之后项目下文件夹中找到【CMakeTargets】中的【INSTALL】,然后右键选择【仅限于项目】–>【仅生成INSTALL】,此时就会发现会【build_new】文件夹下重新生成一个【install】文件夹,环境配置所需的文件均在里面。
环境配置
- 以上是我整理出的网络下载教程,但是实际环境中,安装这个要等很久,我没有耐心等,直接花钱买编译好的安装包,以上流程后续会继续补充。