【问题标题】:Fit a circle or a spline into a bunch of 3D Points将圆或样条拟合成一堆 3D 点
【发布时间】:2013-01-02 02:38:02
【问题描述】:

我有一些 3D 点,它们大致但清楚地形成了一个圆的一部分。我现在必须确定最适合所有点的圆。我认为必须有某种最适合的最小二乘,但我不知道如何开始。 这些点按照它们在圆上的位置进行排序。我在每个点上也有一个估计的曲率。 我需要圆的半径和平面。 我必须使用 c/c++ 或使用外部脚本。

【问题讨论】:

  • 你有没有尝试过?
  • 不,只是在网上搜索了有关最小二乘拟合圆的信息。我发现的大部分都是二维的,所以没有帮助。
  • 您可以将 2D 算法移植到 3D 中。您有 两个 变量:圆心和半径。中心转换为三个坐标,因此总体而言,您需要使用最小二乘法优化 四个 变量(三个坐标和半径)。
  • @alestanis 实际上是六个实变量:圆心和圆的法线向量。 ——但这不是问题,更复杂的是将点到圆的距离的定义推广到3d。
  • 我在想一个球体,我现在明白了。也许有一种简单的方法可以在第一步中检测我们在哪个平面上,旋转我们的坐标,然后在第二步中仅使用两个坐标找到圆?

标签: c++ c geometry least-squares


【解决方案1】:

您可以使用Principal Component Analysis (PCA) 将坐标从三维映射到二维。

计算 PCA 并将您的数据投影到第一个到主成分上。然后,您可以使用任何 2D 算法来查找圆心及其半径。一旦找到/安装了这些,您就可以将中心重新投影到 3D 坐标中。

由于您的数据有噪声,因此在您挤出的第三维度中仍然会有一些数据,但请记住,PCA 选择此维度是为了尽量减少丢失的数据量,即通过最大化数据量这在前两个组件中表示,所以你应该是安全的。

【讨论】:

    【解决方案2】:

    这种数据拟合的一个很好的算法是RANSAC(随机样本共识)。您可以在链接中找到很好的描述,因此这只是重要部分的简短概述:

    在您的特殊情况下,模型 将是 3D 圆。为了构建这个,从你的集合中挑选三个随机的非共线点,计算它们嵌入的超平面(叉积),将随机点投影到平面上,然后应用通常的 2D 圆拟合。有了这个,你就得到了圆心、半径和超平面方程。现在很容易检查每个剩余点的支持。支撑可以表示为到圆的距离,由两部分组成:到平面的正交距离和到平面内的圆边界的距离。

    编辑: i 比普通最小二乘法(LS)更喜欢 RANSAC 的原因是它在大量异常值的情况下具有出色的稳定性。下图显示了 LS 与 RANSAC 的示例比较。理想模型线由 RANSAC 创建,虚线由 LS 创建。

    【讨论】:

    • 这假设所有点都在平面内,但问题是指噪声数据,因此您的解决方案将很大程度上取决于您对最初三个点的选择。
    • 没有。我所描述的只是 一个 RANSAC 运行。该算法执行大量此类运行并输出具有最佳支持的模型,因此最适合噪声数据的圆圈。但这在提供的链接中有所描述。
    • 当然,但如果结果弧不在由三个样本点跨越的平面内,它仍然无法找到最小二乘意义上的最优解。这种启发式很可能会提供一个好的解决方案,但不一定是最好的解决方案。
    • 这不是启发式的。 3D 中的弧根据定义嵌入平面内 :)
    • 是的,但您错过了重点:RANSAC 启发式只会查看由数据集中三个点跨越的平面。那是一组有限的平面,不能保证最优解的平面在那个集合中。
    【解决方案3】:

    可以说是最简单的算法称为最小二乘曲线拟合。 您可能想查看math, 或者看类似的问题,比如polynomial least squares for image curve fitting
    但是我宁愿使用图书馆来做这件事。

    【讨论】:

    • 你碰巧知道这样的库吗?
    • SO 问题的答案提到了 GNU gsl。
    猜你喜欢
    • 2021-03-02
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2019-03-19
    • 1970-01-01
    相关资源
    最近更新 更多