【问题标题】:implementation like kinect hierarchical rotation类似 kinect 分层旋转的实现
【发布时间】: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.toChangeoriginalRelativePointMap 代表什么?

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 抱歉迟到了。我的“关节”成员是从 kinect 等没有高精度关节位置的设备获得的。所以我无法通过关节位置驱动我的模型,我想通过它来驱动它分层方向。
    • 是的,我只是建议你推导出你自己的层次方向,因为我不记得你是否可以直接从 kinect 中提取它。如果您担心噪音,请对每个点应用低通滤波器。但要澄清一下,我建议您将每个关节组合成顺序对,并使用这些方向向量来创建您的层次方向。
    • 我可以为每个框架获得 20 个关节并将它们保存到磁盘以进行离线测试。关键是我不知道如何推导层次方向。我想获得一些示例项目学习了。所以我下载了OpenNIlibfreenect。但是我没有找到这两个项目的相关代码。
    • 现在我通过全局 3d 位置定义每个关节的方向。例如,作为右肘的旋转(标记为elbow_r,hand_r)。在第一帧中,我得到了@987654325 的位置@ 和elbow_r 并将这两个点作为3d向量(elbow_r是初始点,hand_r是终点),并对向量进行归一化(标记为vec1)。在frame2中,我也得到了新关节位置的归一化向量(标记为vec2)。我计算vec1vec2之间的四元数作为关节elbow_r的旋转。我认为驱动人体模型是错误的。但是我不知道如何处理分层腐烂。
    • @北极熊,请给我一些帮助。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    相关资源
    最近更新 更多