2012-07-03 35 views
2

我有一个应用程序,我必须找到从一组15个订购者&索引的3D点(X1,X2,...,X15)到具有相同索引的另一组15点的旋转(1初始点对应1个最终点)。找到优化的旋转

我读过很多关于寻找欧拉角(对某些人来说是邪恶的)旋转,四元数或在基轴上投影矢量的旋转。但是我还有一个额外的限制:我的最终设置的几个点可能是错误的(即有错误的坐标),所以我想区分要求旋转离中位旋转很远的点。我的问题是:对于每组3点(不对齐的)和他们的图像,我可以计算四元数(根据变换矩阵不会是纯旋转的事实,我有一些额外的计算,但它可以做完了)。所以我得到一组四元数(最多455个),我想删除错误的四元数。

有没有办法找到远离平均旋转的旋转点? “平均数”和“标准偏差”是否意味着四元数或我必须计算欧拉角?一旦我有了“好”四元数集,我怎么才能计算出“平均”四元数/旋转?

干杯,

Ricola3D

回答

2

在计算机视觉中,有一种叫做RANSAC的技术用于做你想要的东西。您不需要找到所有可能的四元数,而是使用一组最小的点对应来查找单个四元数/变换矩阵。然后,您将评估所有适合质量的要点,放弃那些不适合的要求。如果你没有足够好的比赛,也许你在原来的比赛中有一场糟糕的比赛。所以你会扔掉那个尝试,然后再试一次。如果你确实得到了足够好的匹配,你将对所有的内点得到最小二乘回归拟合,得到一个新的变换矩阵,然后迭代直到你对结果满意为止。

或者,你可以把你所有的归一化四元数,并找到它们之间的点积。点积应该总是正值;如果它不是用于任何给定的计算,则应该否定两个四元组之一的所有组件并重新计算。然后,您可以在四元数之间进行距离度量,您可以聚类或查找空位。

+0

+1 - 我试图记住技术被称为什么,但我无法放置它... – comingstorm

+0

谢谢,我会尝试看看我的数据集中最好(即最快)的作品。 – Ricola3D

3

这里有2个问题:

  • 你怎么计算的点的任意数目的 “最佳”?
  • 如何决定接受哪些点以及拒绝哪些点?

一般的答案首先是, “做一个least squares适合”。四元数可能比欧拉角更好;请尝试以下操作:

foreach point pair (a -> b), ideal rotation by unit quaternion q is: 
    b = q a q* -> q a - b q = 0 

所以,寻找最小二乘适合q

minimize sum[over i] of |q a_i - b_i q|^2 
under the constraint: |q|^2 = 1 

如上介绍,最小二乘问题是线性的,除了约束,这应该使它比欧拉角公式更容易求解。


对于第二个问题,我可以看到两种方法:

  • 如果你点不算太离谱,你可以尝试解算器的所有点运行最小二乘,然后返回,抛出“异常值”(那些平方误差最大的点对),然后再试一次。
  • 如果矛盾不切实际的点正在抛弃上述过程,您可以尝试选择3对或4对的随机小小子集,并找到每个子集的最小二乘法。如果一大组这些结果具有相似的旋转和低总误差,则可以使用它来识别“良好”对(从而消除不良对)。然后返回并找到适合所有良好配对的最小二乘方。
+1

L1范数最小化 - 将绝对偏差的总和最小化而不是平方偏差的总和 - 比最小二乘法更能抵抗异常值。通常这需要更复杂的优化方法,例如线性编程,但在这里可能很有用。 – japreiss

+0

谢谢。对于最小二乘拟合,我打算做一些类似的事情,但不确定“和”和“减法”对四元数有意义,因为它对旋转没有意义。对于第二个问题,我的观点不可能很远,但是有一点错误会对我的算法的以下步骤产生悲惨后果。但我所知道的是我的对象必须“民主”放置。所以我可以用你的第一个建议在两个步骤中完成,或者我可以通过比较它们的相对位置和更好的复杂性来区分我的观点吗? – Ricola3D

+0

是的,四元数总和是明确的(尽管如你所说,它对旋转没有意义);正方形范数'| q |^2 = q q *'也是如此。对于第二个问题:如果你的“坏”点对距离正确的旋转不太远,你应该测试第一个建议,看它是否工作正常。它需要2个最小二乘步骤:一个是所有点的初始点,另一个是拒绝坏点后的最后一个点。 – comingstorm