如何通过 3D 点云拟合线?

Posted

技术标签:

【中文标题】如何通过 3D 点云拟合线?【英文标题】:How to fit a line through a 3D pointcloud? 【发布时间】:2016-05-18 08:34:47 【问题描述】:

我有一根电缆从行驶中的车辆掉到地上。我使用摄像系统实时估计绳索接触地面的位置。车辆的运动和位置估计的不准确性导致着陆位置的点云。从这个点云中,我想得到铺设在地面上的电缆最可能的路径。我想实时实现这一点,并且我希望根据新数据更新拟合。添加新点的频率约为 20 Hz,而车辆的移动速度约为 1 m/s。因此点云相当密集。电缆在地面上的路径是平滑的(因为电缆很硬)并且是 3D 的(x、y、z:地面不平坦!)。

我一直在寻找 3D 线/样条/曲线拟合/插值。我发现了一些有前途的方法(B 样条拟合,LOWESS -> 似乎可行,在 2D 中可用,但在 3D 中不可用)。但是,对于哪种方法适合我的情况,我找不到任何明确的解释。对于这种情况,您会建议什么拟合方法?

我正在处理的当前数据集由以下人员生成:

import numpy as np

tMax = 10 # s
f = 20 # hz
v = 2 # m/s
samples = tMax*f
t = np.linspace(0,tMax, samples)
div = 00.[![2][2]][2]
x=1*np.sin(t)+t+np.random.uniform(-div,div,samples)
y=1*np.cos(t)+t+np.random.uniform(-div,div,samples)
z=1*np.sin(t)*np.cos(t)+t+np.random.uniform(-div,div,samples)

我设法在 2D 中使用 LOWESS 获得合理的结果,如下图所示,但不是 3D。

我可能要补充的另一件事是数据带有时间戳。我可以想象这可能有利于拟合这条线。

【问题讨论】:

可能是Gaussian process regression?如果无法访问数据,很难给出更具体的答案。 你能添加一些数据吗!? 请发布一个数据集,或链接到一个。这不是一个难题,既然你问了,我们不妨发布一个答案。 鉴于问题是在 16 年发布的,我无法再访问相应的数据集(我知道第一个数据请求也是从 16 年开始的 - 抱歉没有回复) .数据已分类,无论如何都无法共享。该问题与问题中提供的代码生成的数据非常接近。使用这些数据会给您带来什么问题? @ali_m。本质上是卡尔曼滤波器? 【参考方案1】:

您可以使用 scipy UnivariateSpline。

from scipy.interpolate import UnivariateSpline

# new axis
u = np.arange(len(x))

# UnivariateSpline
s = 0.7 * len(u)     # smoothing factor
spx = UnivariateSpline(u, x, s=s)
spy = UnivariateSpline(u, y, s=s)
spz = UnivariateSpline(u, z, s=s)
#
xnew = spx(u)
ynew = spy(u)
znew = spz(u)

【讨论】:

以上是关于如何通过 3D 点云拟合线?的主要内容,如果未能解决你的问题,请参考以下文章

Open3D 点云RANSAC拟合圆(Python版本)

通过 3D 向量拟合线并找到与平面的交点

Python - 使用样条线插值二维点云

如果我对对象的 3D 框进行了注释,如何标记点云?

使用Open3D进行PCD拟合平面的Python代码示例

将“二次”曲面拟合为3D中的数据点