news 2026/6/14 2:46:08

Azure Kinect 从入门到入坟

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 8:25:27

机器人开发新体验:robot_lab框架深度解析与实战指南

机器人开发新体验&#xff1a;robot_lab框架深度解析与实战指南 【免费下载链接】robot_lab RL Extension Library for Robots, Based on IsaacLab. 项目地址: https://gitcode.com/gh_mirrors/ro/robot_lab 在机器人技术快速发展的今天&#xff0c;开发者们面临着如何高…

作者头像 李华
网站建设 2026/6/13 16:24:32

Unity中C#状态模式详解

状态模式是一种行为设计模式&#xff0c;允许对象在内部状态改变时改变其行为&#xff0c;使对象看起来像是修改了其类。1. 状态模式基本概念1.1 状态模式的核心思想将状态封装成独立的类将状态相关的行为委托给当前状态对象允许状态对象在运行时切换1.2 状态模式的三个主要组件…

作者头像 李华
网站建设 2026/6/11 15:19:25

EmotiVoice语音合成结果可读性与自然度评测

EmotiVoice语音合成结果可读性与自然度评测 在数字内容爆炸式增长的今天&#xff0c;用户早已不再满足于“能说话”的语音助手或机械朗读的有声书。我们期待的是会表达、有情绪、像真人一样交流的声音——这正是现代文本转语音&#xff08;TTS&#xff09;技术的核心挑战。 传统…

作者头像 李华
网站建设 2026/6/13 10:09:49

Stable Diffusion WebUI Forge:PyTorch驱动的AI绘画革命

Stable Diffusion WebUI Forge&#xff1a;PyTorch驱动的AI绘画革命 【免费下载链接】stable-diffusion-webui-forge 项目地址: https://gitcode.com/GitHub_Trending/st/stable-diffusion-webui-forge 还在为AI绘画工具的性能瓶颈和兼容性问题头疼吗&#xff1f;&…

作者头像 李华