0

我正在尝试在点云上拟合 3D 线。我正在使用 lmfit 的 minimzer。我将线点距离定义为np.linalg.norm(np.cross(p-v0,v1-v0))/np.linalg.norm(v1-v0)(来自http://www.qc 的方法 2。 edu.hk/math/Advanced%20Level/Point_to_line.htm)。问题是我不确定 minimer 做得好不好。我正在使用最小二乘法,对于较少的点数,拟合不正确。

事实上,np.linalg.norm(np.cross(p-v0,v1-v0))似乎做得更好。如果我理解正确,这将最小化平行四边形区域而不是点线距离。

问题:有没有比最小二乘法更好的算法来最小化距离?有比 lmfit 更好的库吗?为什么第二个方程会给出更好的结果,它只是除以一个标量?

from lmfit import minimize, Parameters, Parameter, 
report_fit,fit_report, Minimizer, printfuncs
import numpy as np

params = Parameters()
params.add('x0',   value= 129)
params.add('x1',   value= -0.5)
params.add('y0',   value= 129)
params.add('y1',   value= -0.5)


def fun(params,x,y,z):
    x0 = params['x0'].value; x1 = params['x1'].value; y0 = 
params['y0'].value; y1 = params['y1'].value
    distance = []

    v0 = np.array([x0, y0, 0])
    v1 = np.array([x0+x1, y0+y1, 1])

    for point in range(len(x)):
        p = np.array([x[point], y[point], z[point]])
        distance.append(np.linalg.norm(np.cross(p-v0,v1-v0))/np.linalg.norm(v1-v0))
    return distance

result = minimize(fun, params,args=(x,y,z))
print(fit_report(result))

使用 plotly 我可以看到拟合的质量:np.linalg.norm(np.cross(p-v0,v1-v0))/np.linalg.norm(v1-v0) vs np.linalg.norm(np.交叉(p-v0,v1-v0))

4

0 回答 0