【问题标题】:Minimize distances to plane最小化到飞机的距离
【发布时间】:2020-06-23 08:11:49
【问题描述】:

我在 3D 空间中有一组点,我知道所有这些点都属于一个平面。但是,这些点中存在一些噪声,因此我不能直接从中提取平面。我想找到最适合这些点的平面公式(ax+by+c*z+d=0)。换句话说,从点到平面的(平方)距离之和应该最小化。

我正在使用 python 和 numpy 完成所有这些,但我似乎无法弄清楚如何准确地实现它。

【问题讨论】:

标签: python numpy geometry


【解决方案1】:

我对 python、scipy 和 numpy 必须提供什么来解决这个问题进行了更多研究,我发现了这段代码恰好可以满足我的需要:

def calcBestNormal(points, origin):
p = np.subtract(points, origin)

# Inital guess of the plane
p0 = np.array([0.506645455682, -0.185724560275, -1.43998120646, 1.37626378129])

def f_min(X, p):
    plane_xyz = p[0:3]
    distance = (plane_xyz * X.T).sum(axis=1) + p[3]
    return distance / np.linalg.norm(plane_xyz)

def residuals(params, signal, X):
    return f_min(X, params)

sol = leastsq(residuals, p0, args=(None, p.T))[0]
normal = np.divide(sol[0:3], np.linalg.norm(sol[0:3]))
return normal

【讨论】:

    【解决方案2】:

    如果计算点分布的奇异值分解,则最小特征值对应的向量将垂直于调整到分布的平面。

    假设points 是一个点矩阵,每行包含一个点:

    centroid = np.mean(points, axis=0)               # point on the plane
    normal = np.linalg.svd(points - centroid)[2][2]  # plane normal (a,b,c)
    d = -centroid.dot(normal)                        # distance to the origin (d)
    plane = np.append(normal, d)                     # plane coefficients (a,b,c,d)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      相关资源
      最近更新 更多