实现像kinect分层旋转

时间:2017-08-23 11:01:09

标签: opencv computer-vision kinect openni skeletal-animation

我会得到一些关于人类20个骷髅的3d位置(在固定世界坐标系中)的数据流。

我想使用骨架数据来驱动具有固定骨骼的人体模型,如demo video

在Kinect SDK v1.8中,我可以通过NUI_SKELETON_BONE_ORIENTATION.hierarchicalRotation获取每个骨架的本地轮换。

我想实现类似的功能。但是Kinect的SDK不是开源的。

我发现函数xnGetSkeletonJointOrientation可以像OpenNI那样得到骨架的旋转。但是我还没有找到关于它的实现函数。我不知道我错在哪里。

任何想法都表示赞赏。谢谢!

修改

我找到了similar question

这是他最后使用的代码。

Point3d Controller::calRelativeToParent(int parentID,Point3d point,int frameID){
if(parentID == 0){
    QUATERNION temp = calChangeAxis(-1,parentID,frameID);
    return getVect(multiplyTwoQuats(multiplyTwoQuats(temp,getQuat(point)),getConj(temp)));
}else{
    Point3d ref = calRelativeToParent(originalRelativePointMap[parentID].parentID,point,frameID);
    QUATERNION temp = calChangeAxis(originalRelativePointMap[parentID].parentID,parentID,frameID);  
    return getVect(multiplyTwoQuats(multiplyTwoQuats(temp,getQuat(ref)),getConj(temp)));
}}
QUATERNION Controller::calChangeAxis(int parentID,int qtcId,int frameID){ //currentid = id of the position of the orientation to be changed
if(parentID == -1){
    QUATERNION out = multiplyTwoQuats(quatOrigin.toChange,originalRelativePointMap[qtcId].orientation);
    return out;
}
else{
    //QUATERNION temp = calChangeAxis(originalRelativePointMap[parentID].parentID,qtcId,frameID);
    //return multiplyTwoQuats(finalQuatMap[frameID][parentID].toChange,temp);
    return multiplyTwoQuats(finalQuatMap[frameID][parentID].toChange,originalRelativePointMap[qtcId].orientation);  
}}

但我仍有一些疑问。

变量quatOrigin.toChangeoriginalRelativePointMap代表什么?

在我看来,函数Point3d point的参数Controller::calRelativeToParent应该是一个带有欧拉角的矢量。这样,如何调用主程序中的Controller::calRelativeToParent API。因为我们只知道根的旋转。

1 个答案:

答案 0 :(得分:0)

骨架类有一个"关节"包含骨架上每个跟踪关节的所有3d位置数据的成员。我会直接查看关节位置数据来驱动模型而不是角度。取一个点作为你的基础(头部或其他)然后在成对的连接骨架点之间生成树形式的向量。缩放这些矢量并将它们应用到您的模型中。