关于Kinect SDK V2的使用要点和开发环境搭建

本文详细介绍了KinectSDKV2的使用,包括通过HRESULT判断函数执行状态、获取传感器指针、数据读取流程,以及两种操作模式。同时,文章涵盖了坐标系转换和在VisualStudio2019中的环境配置,还提到了OpenCV的配合使用及其环境配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  • 记录自己在微软官网学习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三个方法才能最终拿到数据;
  1. 通过IKinectSensor的成员方法,获取资料来源Frame Srouce;例如 IDepthFrameSource
  2. 针对资料来源物件,利用其成员函数取得资料读取器 Frame Reader;例如 IDepthFrameReader
  3. 不断通过资料读取器,去读取相应的资料 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一共有三种坐标系,分别是CameraSpacePointDepthSpacePointColorSpacePoint,其中只有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为例进行环境配置.

  1. 首先,新建个项目,然后在【解决方案资源管理器】中右键项目名,选择【属性】

  2. 在【C/C++】的【常规】里,【附加包含目录】中加入【$(KINECTSDK20_DIR)\inc】
    在这里插入图片描述

  3. 在【链接器】的【常规】里,【附加库目录】中加入【$(KINECTSDK20_DIR)\Lib\x64】
    在这里插入图片描述

  4. 在【链接器】的【输入】里,【附加依赖项】中加入【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的优点包括易于使用、高效、跨平台、支持多种编程语言、具有丰富的算法和工具库等。因此,它在计算机视觉和图像处理领域得到了广泛的应用,包括机器人技术、自动驾驶、安防监控、医学影像、工业检测等多个领域

  1. 环境变量配置 ,在系统变量中将OpenCV对应的bin路径加入到【PATH】中
D:\OpenCV\opencv\build\x64\vc15\bin
  1. 右键点开项目的【属性页】,然后找到【VC++目录】,在【包含目录】中输入以下内容
D:\OpenCV\opencv\build\include\opencv2  
D:\OpenCV\opencv\build\include\opencv2

在这里插入图片描述

  1. 添加【库目录】,输入【D:\OpenCV\opencv\build\x64\vc15\lib】

在这里插入图片描述

  1. 在【链接器】的【常规】中,找到【附加依赖项】,输入【opencv_world460d.lib】(460是opencv相应版本号的缩写)

在这里插入图片描述


Opencv拓展模块安装opencv_contrib

在进行骨架细化的时候才发现opencv自身是没有【opencv2/ximgproc.hpp】这个头文件配置的,上网查了才发现原来还需要额外安装一个opencv_contrib,而且比安装opencv还要麻烦,还需要用到cmake对其文件进行编译。

软件下载

  1. 首先在cmake官网下载最新版
  2. 然后在opencv官网下载和opencv版本相符的opencv_contrib
    下载完之后解压到opencv目录下就行,然后还需要在opencv目录下新建一个文件夹【bulid_new】用来存放contrib编译后的文件
    在这里插入图片描述

文件编译

  1. 打开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”表示编译完成。

重新生成解决方案

  1. 重新生成解决方案
  • 在new_build目录中找到【OpenCV.sln】,用visual2019打开,然后切换到Debug模式下
  • 在解决方案中选中项目,右键选择重新生成解决方案
  • 之后项目下文件夹中找到【CMakeTargets】中的【INSTALL】,然后右键选择【仅限于项目】–>【仅生成INSTALL】,此时就会发现会【build_new】文件夹下重新生成一个【install】文件夹,环境配置所需的文件均在里面。

环境配置

  • 以上是我整理出的网络下载教程,但是实际环境中,安装这个要等很久,我没有耐心等,直接花钱买编译好的安装包,以上流程后续会继续补充。
### OmegaConf 配置管理简介 OmegaConf 是一个强大的 Python 库,用于处理复杂的配置文件。它支持多种数据结构(如字典、列表)以及 YAML 文件的解析操作。以下是有关如何使用 OmegaConf 的详细介绍。 #### 创建配置对象 可以通过 `OmegaConf.create` 方法创建一个新的配置对象。该方法可以接受字典、YAML 字符串或其他兼容的数据结构作为输入[^1]。 ```python import omegaconf from omegaconf import OmegaConf config_dict = {"database": {"host": "localhost", "port": 6379}} config = OmegaConf.create(config_dict) print(OmegaConf.to_yaml(config)) # 将配置转换为 YAML 格式的字符串 ``` #### 加载外部 YAML 文件 如果需要加载外部 YAML 文件,可使用 `OmegaConf.load` 方法。这使得程序能够轻松读取并应用存储在磁盘上的配置文件。 ```python yaml_file_path = "./example_config.yaml" file_conf = OmegaConf.load(yaml_file_path) # 打印加载后的配置内容 print(file_conf.database.host) # 输出 'localhost' ``` #### 合并多个配置源 当存在多个配置来源时(例如默认设置与命令行参数),可以使用 `OmegaConf.merge` 来无缝合并它们。此功能允许开发者优先级较高的配置覆盖较低级别的配置项。 ```python default_configs = OmegaConf.create({"model": {"type": "resnet50"}}) cli_args = OmegaConf.from_dotlist(["model.type=vgg16"]) merged_config = OmegaConf.merge(default_configs, cli_args) assert merged_config.model.type == "vgg16" # 命令行参数成功覆盖默认值 ``` #### 动态更新配置 除了静态定义外,还可以通过访问器动态修改现有配置中的字段。这种灵活性非常适合运行时调整某些超参数或环境变量。 ```python dynamic_update = file_conf.copy() dynamic_update.database.port = 8080 print(dynamic_update.database.port) # 输出新的端口号 8080 ``` #### 错误处理机制 为了防止非法赋值破坏整个系统的稳定性,OmegaConf 提供了严格的模式控制选项。启用严格模式后,任何未声明过的键都将引发异常提示用户修正错误。 ```python strict_mode_enabled = file_conf.copy() strict_mode_enabled.set_struct(True) # 开启只读保护状态 try: strict_mode_enabled.new_field = True # 此处会抛出 AttributeError 异常 except AttributeError as e: print(f"Catch expected error: {e}") ``` --- ### 总结 以上展示了 OmegaConf 在不同场景下的典型用法,包括但不限于初始化配置实例、加载外部资源、融合多层设定逻辑以及实施安全防护措施等方面的功能特性。希望这些例子能帮助快速掌握其核心概念技术要点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值