将 azure kinect JSON 输出转换为 BVH

问题描述

我目前的流程是这样的

我使用 Azure-Kinect SDK v1.41 自带的 k4arecorder 录制了两个 MKV 视频。

在第一个中,人处于 T 姿势,在第二个中,他们正在做一些动作。

然后我使用来自 Microsoft/Azure-Kinect-Samples/body-tracking-samples 的 offline_processor 将这两个视频转换为 JSON 对象。对于每一帧,JSON 包含 x、y、z 位置,其中 z 相对于相机位置,y+ 指向下方以及每个关节的四元数方向

对于 T-Pose json 对象,我提取了 1 帧位置和旋转,其中 T-Pose 是完美的。然后我将这个 JSON 对象解析为两个位置和方向的 Pandas 数据帧。方向转换为欧拉角。

对于第二个“运动”Json 对象,我将其解析为另外两个 Pandas 数据帧。在第一个中,每一帧是一行,列是形式

             joint_1.x,joint_1.y,joint_1.z       ...      joint_n.x,joint_n.y,joint_n.z 

在方向矩阵中,每一行也是一个框架,列也是格式

             joint_1.z,joint_1.x       ...      joint_n.z,joint_n.x 

我想知道的是:

如何将所有坐标都在全局空间中的这 4 个矩阵转换为 BVH 文件。我尝试了许多解决方案,但都失败了。

我在此过程中遗漏了一些基本逻辑,如果有人能提供帮助,我将不胜感激。任何语言的任何代码解决方案也受到赞赏

解决方法

我在这方面取得了一些成功。

您必须将关节的全局方向置于其父节点的局部方向。但这实际上意味着什么?

在转换为最终欧拉之前,您应该首先转换为旋转矩阵。我发现的最好的工具是 scipy.spatial.transform.Rotation。

先找到父矩阵,然后求逆,然后在它和子联合矩阵之间执行点积

This code will find the local orientation of a joint in relation to it's parent

这将为您提供子关节的局部方向。但是,您还没有走出困境。这种方法适用于腿部、脊柱和臀部,但会导致手臂真的一团糟

enter image description here

我怀疑这与 Azure Kinect 的联合跟踪方向有关。看看轴到达手臂时如何移动

enter image description here

我真的不太了解轮换来解决这个最后的问题。从锁骨到手,一切都变得一团糟。任何建议都会很棒

,

手非常复杂,因为层次结构很长。使用脊柱胸部的正常旋转来变换手臂运动,然后使用zyx作为旋转顺序。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...