参考链接:PolySpace博客 知乎 Bilibili
Kinect操作
录制动作
打开Kinect Studio,在RECORD页面下录制需要的动作。录制后的文件存放在用户的文档文件夹下的\Kinect Studio\Repositorym目录下

可以看到在左侧有一些配置,交给AI后AI回复:
这些选项与 Kinect 传感器相关,各功能如下:
Nui Body Frame:用于获取人体骨骼框架数据,可追踪人体关节位置、姿势等信息 ,常见于体感游戏、运动分析、人机交互等领域,像在体感游戏中精准捕捉玩家动作转化为游戏角色动作。
Nui Body Index:提供身体索引信息,标识场景中不同人体目标,帮助区分和管理多个个体,比如在多人场景下,能准确识别每个玩家并单独追踪其动作。
Nui Depth:获取深度数据,描述场景中物体与传感器的距离信息,构建场景深度图像,用于 3D 建模、手势识别、避障等,如 3D 建模时确定物体空间位置和距离关系。
Nui IR:提供红外图像数据,不受可见光影响,在暗光或无光环境下正常工作,用于夜间成像、深度感知辅助等,像辅助深度数据获取更准确的距离信息。
Nui Sensor Telemetry:用于收集传感器的遥测数据,包含传感器工作状态、性能指标等信息,方便开发者监控和调试传感器,了解其是否正常稳定运行。
Nui Title Audio:负责处理与标题相关的音频,比如游戏或应用启动界面、菜单界面等的背景音乐或提示音 ,营造相应氛围和提供音频反馈。
Nui Uncompressed Color:获取未压缩的彩色图像数据,呈现场景真实色彩信息,用于图像识别、视觉分析等,像在图像识别任务中提供原始高质量彩色图像。
具体勾选方式取决于你的使用目的:
体感交互开发:若用于开发体感游戏、动作捕捉相关应用,重点勾选Nui Body Frame 、Nui Body Index,前者获取人体骨骼信息实现动作追踪,后者区分多人场景中的不同个体。同时勾选Nui Depth辅助确定人体在空间中的位置,Nui IR可保证在暗光环境正常工作。
视觉图像分析:要是进行图像识别、场景重建等视觉相关工作,Nui Uncompressed Color必选,提供真实色彩图像;搭配Nui Depth获取深度信息,构建三维场景;Nui IR在特殊光照条件下补充图像信息。
传感器状态监测:当需要监控 Kinect 传感器自身状态,勾选Nui Sensor Telemetry ,获取传感器工作参数、性能指标等数据,便于调试和维护。
音频相关应用:若开发涉及音频部分,如特定界面音效控制,勾选Nui Title Audio 来处理相关音频。
在VSB(Visual Gesture Builder)中处理项目
创建工程
打开Visual Geture Builder,首先新建解决方案。然后右键解决方案新建工程)。创建工程可以采用向导或者直接创建
向导创建
右键项目,选择使用向导设置工程(create new project with wizard)
程序打开设置向导如下图,我们点击Next

首先,设置姿势名称,就是你要识别的姿态,你不需要在名称中加入Left和Right,后面程序会提供更多选择,总之,输入一个名字就可以了。
然后,选择是否需要下半身的信息。这个选项的意思是,Kinect可以捕捉人全身的骨骼结点信息,如果你的动作与下半身无关,那么你只需要上半身的结点信息就可以了。由于我要演示的例子是挥手,自然和下半身没有任何关系,所以我选择No。

接下来设置手势识别,Kinect可以识别三种手势,打开、关闭、半开三种状态。我不需要识别手势,所以我选择了No。

下面这个对话框的意思和上面一样,就是选择哪些结点有效,之前我们选择了上本身,显泽给出的是更加细致的选择,比如我选择上半身全部结点有效,你也可以选择只检测左半身、右半身等,这里注意对话框中True、False文字提示哦。

这里就要选择,你是否需要区分左右,当然,我选择Yes。(在这里如果选择No,会弹出让选择复制和镜像数据,即此手势是否对称,在这里不做截图展示,后续可能单独写文章记录)

下面这个对话框是说,你是否需要检测动作进行中的状态。说直接点,就是最终这个问题是被归为一个回归问题还是一个分类问题。
如果选No,则最后输出的是一个Bool值,只判断当前手是否举起,而不会输出举起到什么程度,它使用AdaboostTrigger算法。(离散型)

如果选择Yes,则使用RFR(随机森林回归),最终输出的是一个和动作状态有关的连续值。(连续型)

由于我们区分了左右手,以及区分了离散型和连续型,会默认帮我们创建四个工程,分别为左右手,以及左右手的离散型和连续型。根据具体需求删除不需要的工程。处理好后,按confirm保存,会弹出4个工程的保存信息。

快速创建
右键项目,选择使用向导设置工程(create new project)
Body Side:默认 “Any” ,用于选择手势涉及身体的一侧。
Gesture Type:Discrete (AdaBoostTrigger):离散型手势,通过 AdaBoost 算法触发,用于识别有明确起止状态的动作。Continuous (RFRProgress):连续型手势,基于随机森林回归(RFR)追踪动作进度,适用于持续变化的动作。

加载视频并标注动作
这里,我们可以看到每一个动作的每一个类型下,都会有一个后缀为a的微Analysis,没有a后缀的为训练工程,我们现在只用管训练工程。

我们右键训练工程,点击Add Clip,添加我们第一步事先使用Kinect Studio录制好的视频片断,共有两段,一段是挥动左手的,另一段是挥动右手的。可能会卡顿,请耐心等待加载。
标记样本
选取帧:在时间轴长条区域,可通过左右方向键查看数据帧。按住 “Shift” 键并配合左右方向键,能够选中一段连续的数据帧 。
标记正负样本:
正样本:选中包含所需手势动作的连续帧后,按下 “Enter” 键,或在表示当前帧位置的竖线上右键选择标记为正样本,此时选中帧区域会出现蓝色线段标识 ,代表这些帧是记录了需要动作的正样本。
负样本:选中不包含所需手势动作的帧,按下 “Space” 键 ,将其标记为负样本。一般重点标记正样本,负样本标记按需进行。
根据要求进行标注

完成上面操作后,在动作训练文件上右击Build,如下图所示,将所有的训练动作都是同样操作,会保存成为一个个的*.gba格式的文件。
一般我们会记录很多个动作样本,然后把其中的2/3用于训练分类器,1/3用于测试这个分类器。如果你还剩下一些没有训练的视频片段,可以把视频add clip到.a 的文件之下,来测试分类器。
如果你没有额外的视频片段了,右键工程选择Live Preview,选择刚刚Build完成之后在output栏保存的.gba/.gbd分类器文件。VGB软件会打开你的Kinect并且实时判断你当前的动作。直方图内的数值越高,表示你的动作越符合。

所有的动作文件都保存完成后,在解决方案上右击Build,然后进行保存,这时候保存的文件会保存成*.gbd格式的文件。.gbd文件才是我们在unity中使用的文件。
由上面的部分就可以知道.gba和.gbd文件格式的区别了,.gba文件是保存了单个动作训练的文件。而.gbd则是保存了多个动作的训练文件的集合。而这个.gbd文件将会在Unity中进行使用。
在Unity中使用
打开Unity,并导入Kinect v2 Examples with MS-SDK 插件,找到里面的案例Demo。可以去官方文档,得知每一个场景具体功能。GithubWiki

VisualGestureManager组件就是所需要的组件。Gexture Database传递的是完整文件路径。可重写代码重新实现。
