Kinect2.0获取关节姿态(Joint Orientation)
- Bones Hierarchy
骨骼层次结构从SpineBase作为根节点开始,一直延伸到肢体末端(头、指尖、脚):

层级结构如下图所示:

通过IBody::GetJointOrientations函数可以获取到关节的姿态:
HRESULT = pBody -> GetJointOrientations(_countof(joints), jointOrientations);
关节姿态是一个结构体,其中包含了代表姿态的四元数部分:
typedef struct _JointOrientation {
JointType JointType;
Vector4 Orientation; // quaternion
} JointOrientation;
这里要搞清楚很关键的一点就是姿态是相对于哪个坐标系来描述的以及坐标系是如何定义的。网上说法不一(根本就找不到一个官方的解释...),MSDN论坛上有些人说是相对于父节点来描述的,那样的话要获得某一节点的绝对姿态必须遍历骨骼层次结构直到根节点,并将遍历路径上的旋转矩阵(四元数)相乘,以获得相对于固定坐标系的姿态矩阵. To calculate the absolute orientation of each bone, multiply the rotation matrix of the bone by the rotation matrices of the parents (up to the root joint). 不过也有讨论说这个姿态就是摄像机坐标下的,而不是相对于父节点的。如果是这样的话就省去了很多中间计算步骤。下面进行测试来看看关节姿态到底是怎么描述的:
1. 末端节点(Head、HandTip、Thumb、Feet)不含有姿态信息,这些关节返回的四元数各分量都为0:

2. 所有的关节姿态描述都以摄像机坐标系为参考,当人体站正朝向Kinect时SpineBase关节处的坐标系如下图所示。此时返回的关节四元数理论上应为(w,x,y,z)=(0,0,1,0),对应的Z-Y-X欧拉角为(180°,0,180°)或(0,180°,0)

站正后进行测试,输出SpineBase关节的四元数,可以看出与理论结果很接近:

下面我保持身体竖直,绕着从头顶到脚底的轴线(Y轴)旋转一定角度,将SpineBase关节的姿态四元数转换成欧拉角并记录在CSV文件中。下图是根据原始数据绘制的曲线图,可以看出我在绕Y轴旋转身体时X轴和Z轴角度是没有太大变化的(由于Kinect精度所限和各种噪声干扰也不可能一直是180°),而Y轴角度数据有明显的线性增长趋势,对应了我身体的匀速转动:

3. 关节坐标系的Y轴沿着骨骼的方向,Z轴为骨骼转动轴( Z-axis points to the direction that makes sense for the joint to rotate),X轴与Y轴和Z轴垂直,构成右手坐标系:
- Bone direction(Y green) - always matches the skeleton.
- Normal(Z blue) - joint roll, perpendicular to the bone
- Binormal(X red) - perpendicular to the bone and norma
比如对于肘关节和膝关节来说,只有一个转动自由度,因此Z轴(平行于冠状轴)朝向身体的两侧,关节带动骨骼绕着Z轴旋转,如下图所示:

当站正朝向kinect时,右肘关节的姿态四元数理论上应为(w,x,y,z)=(0, 0.707, 0, 0.707),下面是站正测试得到的实际值,可以看出还算比较接近:

另外也可以在Kinect Studio中的Monitor 3D View界面上进行设置来查看关节姿态信息:

关节箭头显示的方向就是法向,即旋转轴的指向:

可以看出肩关节和髋关节的Z轴都是指向身体前方。有了这些关节姿态信息我们就可以方便的控制虚拟人物或者实体机器人(当然得到每个关节的三位坐标点然后计算关节夹角也可以)。
参考:
Adventures in Motion Capture: Using Kinect Data (Part 1)
Adventures in Motion Capture: Using Kinect Data (Part 2)
Adventures in Motion Capture: Using Kinect Data (Part 3)
How to interpret JointOrientation data
Meaning of Rotation Data of K4W v2
Kinect2.0获取关节姿态(Joint Orientation)的更多相关文章
- 使用Kinect2.0获取点云以在GLUT中显示
这篇文章用来记录Kinect2.0如何生成点云. 以下示例源自Kinect提供的example修改完成,其名称会在小标题下方注解. 首先,要获取点云需要获取图像的深度数据和颜色数据.最后再将深度数据与 ...
- Kinect2.0获取数据
最近事情真是多,今天抽空研究一下Kinec2.0的数据获取! 系统要求 https://developer.microsoft.com/en-us/windows/kinect/hardware-se ...
- 使用Kinect2.0控制VREP中的虚拟模型
VREP中直接设置物体姿态的函数有3个: simSetObjectOrientation:通过欧拉角设置姿态 simSetObjectQuaternion:通过四元数设置姿态 simSetObject ...
- Kinect2.0点云数据获取
接上一篇:Kinect2.0获取数据 http://blog.csdn.net/jiaojialulu/article/details/53087988 博主好细心,代码基本上帖过来就可以用,注释掉的 ...
- Kinect2.0骨骼跟踪与数据平滑
Kinect v1和Kinect v2传感器的配置比较: Kinect v1 Kinect v2 颜色(Color) 分辨率(Resolution) 640×480 1920× ...
- C#微信公众号开发-高级接口-之网页授权oauth2.0获取用户基本信息(二)
C#微信公众号开发之网页授权oauth2.0获取用户基本信息(一) 中讲解了如果通过微信授权2.0snsapi_base获取已经关注用户的基本信息,然而很多情况下我们经常需要获取非关注用户的信息,方法 ...
- Ext4.0 获取选中行及遍历
var grid= Ext.getCmp('grid'); var records=grid.getSelectionModel().getSelection(); if(records!=null& ...
- 微信公众平台开发—利用OAuth2.0获取微信用户基本信息
在借鉴前两篇获取微信用户基本信息的基础下,本人也总结整理了一些个人笔记:如何通过OAuth2.0获取微信用户信息 1.首先在某微信平台下配置OAuth2.0授权回调页面: 2.通过appid构造url ...
- servlet3.0获取参数与文件上传代码示例
转: servlet3.0获取参数与文件上传代码示例 2018年08月26日 20:25:35 苏凯勇往直前 阅读数:98 package com.igeek.servlet; import ...
随机推荐
- [Web 前端 ] Jquery attr()方法 获取或修改 对象的属性值
cp from : https://blog.csdn.net/gf771115/article/details/18086707 jquery中用attr()方法来获取和设置元素属性,attr是at ...
- JAVA基础知识之编译、运行、打包
一:java环境设置在环境变量中设置以下三个变量: JAVA_HOME=C:\j2sdk1.4.1 //可以改为相应的目录CLASSPATH=%JAVA_HOME%\lib\tools.jar;%JA ...
- 如何解决rar文件解压缩失败
附件经常会是一系列的压缩文件,下载是默认文件名是一个随机数字.因而下载完会出现压缩文件解压缩失败解决方法:下载时重命名为带一定顺序的文件名,如文件1,文件2,文件3等 如何解决单个文件解压失败?论坛中 ...
- [转]php socket编程通信
FROM : http://blog.csdn.net/baixiaoshi/article/details/9399083 今天终于测试成功了php中的socket通信,先看原理图 这里可以清晰的看 ...
- linux和windows时间同步问题(UTC&localtime)
Linux使用 UTC,但是windows默认使用localtime.解决的办法如下(重启后生效). 进入windows使用regedit写入DWORD值(设置成十六进制"1"): ...
- [leetcode]N-Queens @ Python
原题地址:https://oj.leetcode.com/problems/n-queens/ 题意:经典的N皇后问题. 解题思路:这类型问题统称为递归回溯问题,也可以叫做对决策树的深度优先搜索(df ...
- PyTorch保存模型与加载模型+Finetune预训练模型使用
Pytorch 保存模型与加载模型 PyTorch之保存加载模型 参数初始化参 数的初始化其实就是对参数赋值.而我们需要学习的参数其实都是Variable,它其实是对Tensor的封装,同时提供了da ...
- 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
http://www.cnblogs.com/del/archive/2010/04/16/1713886.html 跳转指令分三类:一.无条件跳转: JMP;二.根据 CX.ECX 寄存器的值跳转: ...
- python 获取几小时之前,几分钟前,几天前,几个月前,及几年前的具体时间
引入以下两个包: import datetime import arrow 具体代码 # import datetime # import arrow def getTime(self, flag,d ...
- 离线LCA学习
题目1 : 近期公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 上上回说到,小Hi和小Ho用很拙劣--或者说粗糙的手段山寨出了一个奇妙的站点,这个站点能 ...