【发布时间】:2017-08-23 11:01:08
【问题描述】:
我会得到一些关于人类 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.toChange 和originalRelativePointMap 代表什么?
而在我看来,函数Controller::calRelativeToParent的参数Point3d point应该是一个欧拉角的向量。这样,如何在主程序中调用Controller::calRelativeToParent API。因为我们知道根的旋转仅限。
【问题讨论】:
标签: opencv computer-vision kinect openni skeletal-animation