首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找最优旋转

查找最优旋转
EN

Stack Overflow用户
提问于 2012-07-03 22:10:51
回答 2查看 2.3K关注 0票数 4

我有一个应用程序,我必须找到从一组15个排序器和索引的3D点(X1,X2,...,X15)到另一组具有相同索引的15个点(1个初始点对应1个终结点)的旋转。

我读过很多关于使用Euler角(对某些人来说是邪恶的)、四元数或将向量投影到基轴上的旋转。但是我有一个额外的约束:我的最终集合中的一些点可能是错误的(即有错误的坐标),所以我想区分要求旋转的点离中值旋转非常远。

我的问题是:对于每组3个点(不是对齐的)和它们的图像,我可以计算四元数(根据转换矩阵不是纯旋转的事实,我有一些额外的计算,但这是可以做到的)。所以我得到了一组四元数(最多455个),我想去掉那些错误的。

有没有办法找出哪些点的旋转距离平均旋转很远?对于四元数来说,“均值”和“标准差”意味着什么,还是我必须计算欧拉角?一旦我得到了一组“好的”四元数,我如何计算“平均”四元数/旋转呢?

干杯,

Ricola3D

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-06 23:26:03

在计算机视觉中,有一种叫做RANSAC的技术可以做你想做的事情。您可以使用一组最小的点对应关系来查找单个四元数/变换矩阵,而不是查找所有可能的四元数。然后,您将评估所有点的拟合质量,丢弃那些不够拟合的点。如果你没有足够好的匹配项,也许你的原始集合中有一个糟糕的匹配项。因此,您将放弃该尝试,并再次尝试。如果你确实得到了足够好的匹配,你将对所有的inlier点进行最小二乘回归拟合,以获得一个新的转换矩阵,然后迭代,直到你对结果满意。

或者,你可以把你所有的四元数归一化,找出它们之间的点积。点积应该始终是正的;如果它不是用于任何给定的计算,那么您应该对两个四元数中的一个的所有分量求反,然后重新计算。然后,您有了四元数之间的距离度量,您可以聚类或查找间隙。

票数 3
EN

Stack Overflow用户

发布于 2012-07-04 06:10:55

这里有两个问题:

  • 如何计算任意数量点的“最佳拟合”?
  • 如何决定接受哪些点,拒绝哪些点?

对第一个问题的一般回答是,“做一个least squares拟合”。在这方面,四元数可能比Euler角度更好;请尝试以下方法:

代码语言:javascript
运行
复制
foreach point pair (a -> b), ideal rotation by unit quaternion q is:
   b = q a q*   ->   q a - b q = 0

因此,寻找适合q的最小二乘法

代码语言:javascript
运行
复制
minimize sum[over i] of |q a_i - b_i q|^2
under the constraint:  |q|^2 = 1

如上所述,除了约束之外,最小二乘问题是线性的,这应该比欧拉角公式更容易解决。

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

  • 如果你的点不是太远,你可以尝试运行所有点的最小二乘求解器,然后返回,抛出“离群值”(那些平方误差最大的点对),然后再试一次。
  • 如果非常不一致的点正在抛出上述过程,你可以尝试随机选择3或4对的小子集,并找到适合每个点的最小二乘解。如果一大组这样的结果有相似的旋转,总误差很低,你可以用它来识别“好”的配对(从而消除坏的配对);然后返回并找到适合所有好配对的最小二乘。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11312758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档