将圆或样条曲线拟合成一堆3D点

时间:2012-10-22 08:08:36

标签: c++ c geometry least-squares

我有一些粗略的3D点,但显然是一个圆圈的一部分。我现在必须确定最适合所有点的圆。我认为必须有某种最小方块最合适,但我无法弄清楚如何开始。 这些点按照它们在圆圈上的方式排序。我在每个点都有一个估计的曲率。 我需要半径和圆的平面。 我必须使用c / c ++或使用extern脚本。

3 个答案:

答案 0 :(得分:4)

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

计算PCA并将数据投影到第一个到主要组件。然后,您可以使用任何2D算法来查找圆的中心及其半径。找到/拟合后,您可以将中心投影回3D坐标。

由于您的数据噪音很大,您在第三维中仍会有一些数据被挤出,但请记住,PCA会选择此维度,例如最大限度地减少数据丢失量,即最大化数据量在前两个组件中表示,所以你应该是安全的。

答案 1 :(得分:3)

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

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

修改 之所以因为 i 更喜欢RANSAC而不是普通的最小二乘(LS)是因为它在重型异常值的情况下具有优越的稳定性。下图显示了LS与RANSAC的示例比较。理想的模型线由RANSAC创建,虚线由LS。enter image description here

创建

答案 2 :(得分:1)

可称为最简单的算法称为最小二乘曲线拟合。 您可以查看math, 或者查看类似的问题,例如polynomial least squares for image curve fitting
但是,我宁愿使用库来实现它。