当前位置: 首页 > news >正文

Azure Kinect 从入门到入坟

要开始折腾折腾 Azure Kinect 了,注意它和 Kinect 并不是一个东西。


左边这个是 Azure Kinect,右边那个是 Kinect,或者叫 Microsoft Kinect 或者 Kinect for Windows,它两既长得不一样,用法也不一样,所以不要弄混了。Azure Kinect 用起来要简单一些。

Azure Kinect 的官方文档网址是 aka.ms/kinectdocs,它会跳转到 https://learn.microsoft.com/zh-cn/previous-versions/azure/kinect-dk/,我们也可以直接访问这个网址。这个是机翻的中文文档,内容不多,按照文档一步步操作就行,没什么难度。唯一要吐槽的就是这个鸡翻,没错,就像是鸡翻译的。举几个例子。

这里 “正文” 其实是 body。然后还有

这里标题中的 “车身框架” 和 下面的 “主体框架” 实际上都是 body frame,后面的 “主体索引映射” 是 body index map。更离谱的是下面这个。

“尸体” ??body 愣是给干成了 “尸体”,你就说是不是从入门到入坟吧。

如果想看英文原文的话,可以把文档连接中的zh_cn替换成en-us就可以了。虽然官方文档的内容不算多,但也不是这一篇博客能完全涵盖的,这里只是告诉大家如何正确的开始,正所谓师傅领进门。

言归正传。

安装SDK

Azure Kinect 有两个 SDK:

  • 一个是传感器 SDK,用来获取传感器数据,从这里下载安装就行。

  • 另一个是骨架追踪的 SDK,用来获取身体骨架关节数据,从这里下载安装。下载的时候我们选择 msi 版本。

第一个 SDK 只能装在 C 盘,第二个可以自由选择安装路径。这两个 SDK 在安装目录的tools目录里下也提供了一些工具给我们,可以将tools目录添加到环境变量,方便使用。

比如传感器 SDK 提供的k4aviewer.exe可以查看摄像头和麦克风数据,k4arecorder.exe可以用来录制视频。骨架追踪 SDK 提供的k4abt_simple_3d_viewer.exe可以用来查看人体骨骼关节。我们可以用它们来验证设备是否正常工作。

需要注意的是 Azure Kinect 必须连接到 USB 3.0 接口,大多数电脑用蓝色标记,联想电脑在 USB 接口旁边有 SS 字样标记。

代码获取数据

官网的示例可以直接跑,我们先来创建一个c++控制台工程,我用的是 visual studio 2022。在解决方案管理器中右键项目名,点击管理 NuGet 程序包


打开包管理页面后,在搜索框中输入Microsoft.Azure.Kinect,然后依次点击前两个包,在右边详情页点击安装。因为我已经安装过来,所以显示的是卸载按钮。

  • Microsoft.Azure.Kinect.Sensor包用来获取传感器数据;
  • Microsoft.Azure.Kinect.BodyTracking包用来获取人体骨架关节,如果不做人体追踪,只安装第一个就行。

依赖包会安装到项目的packages目录下,还自动生成了packages.config文件。不得不说,c嘎嘎终于鸟枪换炮了,包管理还是香。当然,你也可以用以前的那种方式去依赖之前安装的 SDK,头文件和库文件都在安装目录的sdk目录下。

添加完依赖以后,就可以导入相关头文件开始编程了。

#include<k4a/k4a.h>#include<k4abt.h>

传感器相关的功能都在k4a下,人体追踪相关的功能都在k4abt下,bt就是BodyTracking 的缩写。

把构建您的第一个身体追踪应用程序的示例程序拷贝到cpp文件中。

#include<stdio.h>#include<stdlib.h>#include<k4a/k4a.h>#include<k4abt.h>#defineVERIFY(result,error)\if(result!=K4A_RESULT_SUCCEEDED)\{\printf("%s \n - (File: %s, Function: %s, Line: %d)\n",error,__FILE__,__FUNCTION__,__LINE__);\exit(1);\}\intmain(){k4a_device_tdevice=NULL;VERIFY(k4a_device_open(0,&device),"Open K4A Device failed!");// Start camera. Make sure depth camera is enabled.k4a_device_configuration_tdeviceConfig=K4A_DEVICE_CONFIG_INIT_DISABLE_ALL;deviceConfig.depth_mode=K4A_DEPTH_MODE_NFOV_UNBINNED;deviceConfig.color_resolution=K4A_COLOR_RESOLUTION_OFF;VERIFY(k4a_device_start_cameras(device,&deviceConfig),"Start K4A cameras failed!");k4a_calibration_tsensor_calibration;VERIFY(k4a_device_get_calibration(device,deviceConfig.depth_mode,deviceConfig.color_resolution,&sensor_calibration),"Get depth camera calibration failed!");k4abt_tracker_ttracker=NULL;k4abt_tracker_configuration_ttracker_config=K4ABT_TRACKER_CONFIG_DEFAULT;VERIFY(k4abt_tracker_create(&sensor_calibration,tracker_config,&tracker),"Body tracker initialization failed!");intframe_count=0;do{k4a_capture_tsensor_capture;k4a_wait_result_tget_capture_result=k4a_device_get_capture(device,&sensor_capture,K4A_WAIT_INFINITE);if(get_capture_result==K4A_WAIT_RESULT_SUCCEEDED){frame_count++;k4a_wait_result_tqueue_capture_result=k4abt_tracker_enqueue_capture(tracker,sensor_capture,K4A_WAIT_INFINITE);k4a_capture_release(sensor_capture);// Remember to release the sensor capture once you finish using itif(queue_capture_result==K4A_WAIT_RESULT_TIMEOUT){// It should never hit timeout when K4A_WAIT_INFINITE is set.printf("Error! Add capture to tracker process queue timeout!\n");break;}elseif(queue_capture_result==K4A_WAIT_RESULT_FAILED){printf("Error! Add capture to tracker process queue failed!\n");break;}k4abt_frame_tbody_frame=NULL;k4a_wait_result_tpop_frame_result=k4abt_tracker_pop_result(tracker,&body_frame,K4A_WAIT_INFINITE);if(pop_frame_result==K4A_WAIT_RESULT_SUCCEEDED){// Successfully popped the body tracking result. Start your processingsize_tnum_bodies=k4abt_frame_get_num_bodies(body_frame);printf("%zu bodies are detected!\n",num_bodies);k4abt_frame_release(body_frame);// Remember to release the body frame once you finish using it}elseif(pop_frame_result==K4A_WAIT_RESULT_TIMEOUT){// It should never hit timeout when K4A_WAIT_INFINITE is set.printf("Error! Pop body frame result timeout!\n");break;}else{printf("Pop body frame result failed!\n");break;}}elseif(get_capture_result==K4A_WAIT_RESULT_TIMEOUT){// It should never hit time out when K4A_WAIT_INFINITE is set.printf("Error! Get depth frame time out!\n");break;}else{printf("Get depth capture returned error: %d\n",get_capture_result);break;}}while(frame_count<100);printf("Finished body tracking processing!\n");k4abt_tracker_shutdown(tracker);k4abt_tracker_destroy(tracker);k4a_device_stop_cameras(device);k4a_device_close(device);return0;}

把 Azure Kinect 插上电源,连接到电脑,然后点击运行按钮,大功告成。

需要更多功能可以查看相关 API 或者查看官方示例程序:

  • https://microsoft.github.io/Azure-Kinect-Body-Tracking/release/1.x.x/structk4abt__frame__t.html
  • https://github.com/microsoft/Azure-Kinect-Samples/tree/master

http://www.cnnetsun.cn/news/106410.html

相关文章:

  • 终极Element Plus自动化部署指南:Jenkins与GitHub Actions实战全解析
  • 虚拟偶像配音难题破解:EmotiVoice提供自然情感语音方案
  • 如何用Zotero和Obsidian打造终极学术写作工作流?3个实战场景揭秘
  • 【无人船】基于模型预测控制(MPC)对USV进行自主控制研究附Matlab代码
  • 腾讯混元Video技术破局:开源130亿参数视频生成模型的创新架构与应用实践
  • GoScan终极指南:如何快速掌握交互式网络扫描利器
  • 深入理解 Java 线程池:原理、应用与最佳实践
  • Home Assistant OS 系统更新失败终极解决方案指南
  • 构建工业级ReAct智能体系统:LangGraph+MCP供应链管理全栈实现!
  • 多向量搜索技术ColBERT揭秘:提升RAG召回相关性,细粒度信息优化搜索效果!
  • 微信公众号 Markdown 编辑器,让你不再为微信内容排版
  • vue小程序基于Vue的高校心理咨询系统的设计和实现_qm264681
  • Winlator终极指南:手机运行Windows应用权限管理与性能优化完整教程
  • 10分钟极速搭建:transfer.sh私有文件分享系统全攻略
  • VR青少年法律知识学习系统|VR隔空 “解锁” 法律密码
  • coze工作流成品导入一键生成AI漫剧智能体搭建
  • 复杂工业场景如何实现3D实例与部件一体化分割?多视角贝叶斯融合的分层图像引导框
  • 【企业级Docker更新实战指南】:Agent服务无缝升级的5大黄金步骤
  • PLC通讯编程系列之一,为什么复位发送请求信号要在发送块的前面?
  • (VSCode Qiskit配置验证全流程)新手避坑指南——专家级配置实践
  • 【量子编程必备技能】:如何让VSCode完美支持Qiskit代码智能提示?
  • IDEA配置
  • Q#-Python混合调试实战指南(量子编程调试稀缺技术曝光)
  • 2026数字经济定调:数据要素成核心引擎,可信数据空间建设引行业升级
  • Vue Query Builder 终极指南:从零开始构建复杂查询界面 [特殊字符]
  • Qwen3模型推理性能优化:从思考模式到高效输出的完整指南
  • 瞄准网络安全人才缺口:大学生的机遇与成长路径
  • AI模型智能评估平台:从数据迷雾到精准决策的跨越
  • Subfinder终极指南:全面解决所有字幕下载难题
  • “负碳航空”的流行,是工业文明的一场“赎罪”与“自救”。