问题描述
我目前的流程是这样的
我使用 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。
先找到父矩阵,然后求逆,然后在它和子联合矩阵之间执行点积
这将为您提供子关节的局部方向。但是,您还没有走出困境。这种方法适用于腿部、脊柱和臀部,但会导致手臂真的一团糟
我怀疑这与 Azure Kinect 的联合跟踪方向有关。看看轴到达手臂时如何移动
我真的不太了解轮换来解决这个最后的问题。从锁骨到手,一切都变得一团糟。任何建议都会很棒
,手非常复杂,因为层次结构很长。使用脊柱胸部的正常旋转来变换手臂运动,然后使用zyx作为旋转顺序。