Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 如何跟踪球体上的特征?_Math_Quaternions - Fatal编程技术网

Math 如何跟踪球体上的特征?

Math 如何跟踪球体上的特征?,math,quaternions,Math,Quaternions,我试图通过跟踪球体上的曲面特征来跟踪球体的旋转 TL;博士:我对四元数求平均值是错的吗 介绍 让我们跳过特征检测和匹配,这只是OpenCV中的ORB+FLANN。这将为两个连续帧提供两组(匹配的)关键点 我通过根据关键点到球体中心的距离将它们放置在球体上,将它们投影到3d中。这给了我球体坐标系中的关键点 (暂时不要在意大向量) 从匹配的关键点作为向量,我计算一组四元数,表示自上一帧()以来的旋转 问题 所以在这一点上,我的想法是,所有这些四元数代表相同的旋转(加/减噪声)。所以在理论上,我应该

我试图通过跟踪球体上的曲面特征来跟踪球体的旋转

TL;博士:我对四元数求平均值是错的吗

介绍 让我们跳过特征检测和匹配,这只是OpenCV中的ORB+FLANN。这将为两个连续帧提供两组(匹配的)关键点

我通过根据关键点到球体中心的距离将它们放置在球体上,将它们投影到3d中。这给了我球体坐标系中的关键点

(暂时不要在意大向量)

从匹配的关键点作为向量,我计算一组四元数,表示自上一帧()以来的旋转

问题 所以在这一点上,我的想法是,所有这些四元数代表相同的旋转(加/减噪声)。所以在理论上,我应该能够计算四元数集的平均四元数,并且很好地了解球体自上一帧()以来的移动情况

问题是,这将导致所有帧的单位四元数(或接近,如e^-06 close):

(“对所有四元数进行朴素”平均实际上会产生一种结果,这种结果看起来可能与原始旋转相吻合,但我更愿意使用一种经过验证的方法)

所以,我有两个理论:

  • 有几千个四元数会导致求和和和特征向量计算中的灾难性相消。或(更有可能):
  • 我的思想有一个错误
  • 想法


    我知道我必须处理摄像机的投影问题,但为了证明概念,我选择忽略它。

    你的问题是什么?不清楚你想找什么

    然而,不管是什么,你的算法显然是错误的。球体上1点的移动不会唯一定义球体旋转

    我的想法是所有这些四元数代表相同的旋转

    他们不是。您可以使用公式从单个点的移动中查找四元数。该公式得出的旋转假设该点沿一个大圆移动

    旋转球体时,只有赤道上的点(由旋转轴定义)沿大圆移动,其余点沿其他更有趣的曲线移动

    更新:据我所知,你有噪音、跟踪伪影和其他恶作剧。一种方法是使用数值方法直接从点查找欧拉角(不是四元数,四元数需要规范化,即它们对解算器具有不必要的自由度)。也许CV中的
    DownhillSolver
    ConjGradSolver
    对您有用。运行两次可能会很有用,找到旋转,然后用最差的预测降低10-20%的点,然后再对好的80-90%的点进行求解


    更新2参见图片。绿线是作为球体旋转一部分的两点的实际移动。显然,它们绕着同一个轴旋转,但不是沿着大圆旋转。红线是沿着这些点对之间的大圆旋转,由错误应用的公式发现。蓝色虚线是红色旋转的轴。我希望你现在明白了为什么你不能应用这个公式。

    这里的关键似乎是“大圈”的问题。如果算法使用了关键点和旋转轴上的一个点,在垂直于轴并包含两个关键点的平面上,那么您将获得所讨论的点(或diff)的唯一旋转。令人费解的是,只要位于垂直于旋转轴的平面内,无论距离赤道有多远,每个点对的角度都是相同的。:/我讨厌夸茨。@f我看不到更新。这也是为了避免浪费太多的CPU时间,尤其是
    XMScalarSinCosEst
    。我不确定大圆是怎么回事@3Dave指出,所有旋转(在3d中)应具有相同的旋转轴。在小的时间增量中,球体不能在多个轴上旋转(可以吗?)。也许我应该试着直接研究轴的角度。我会看看结果如何。关于噪音:有噪音和假关键点,但我做了一个体面的工作删除它们。我只是尝试了一下,发现旋转轴到处都是,我会假设它们至少有点像球体的“真实”旋转轴。这可能是因为我现在想起来的截锥体变形。我会看看删除它是否有帮助,但我必须为此做一些新的录音。@fho它不是平截体,你不能应用这个公式。请参阅其他更新。
    a = np.cross(v1,v2)
    w = np.sqrt(np.linalg.norm(v1)**2 * np.linalg.norm(v2)**2) + np.dot(v1,v2)
    return quaternion(w, a[0], a[1], a[2]).normalized()
    
    np.linalg.eig(np.mean(np.array([np.outer(q,q) for q in quats]), axis=0))[0]
    
    quaternion(0.999999999865224, -4.24742027709118e-06, 1.4799762763963e-05, 5.69900765792268e-06)