python - 将圆柱体拟合到分散的 3D XYZ 点数据

标签 python geometry surface point-clouds

如标题所示,我想使用 Python 将圆柱体拟合到一组 3D 点。这是一个不错的solution with MATLAB 。我们如何用Python 来做到这一点?

enter image description here

最佳答案

使用 scipy.optimize.leastsq,我们可以创建一个误差函数,其中观察到的圆柱体半径与建模半径之间的差异最小化。下面是拟合立式圆柱体的示例

import numpy as np
from scipy.optimize import leastsq


def cylinderFitting(xyz,p,th):

    """
    This is a fitting for a vertical cylinder fitting
    Reference:
    http://www.int-arch-photogramm-remote-sens-spatial-inf-sci.net/XXXIX-B5/169/2012/isprsarchives-XXXIX-B5-169-2012.pdf

    xyz is a matrix contain at least 5 rows, and each row stores x y z of a cylindrical surface
    p is initial values of the parameter;
    p[0] = Xc, x coordinate of the cylinder centre
    P[1] = Yc, y coordinate of the cylinder centre
    P[2] = alpha, rotation angle (radian) about the x-axis
    P[3] = beta, rotation angle (radian) about the y-axis
    P[4] = r, radius of the cylinder

    th, threshold for the convergence of the least squares

    """   
    x = xyz[:,0]
    y = xyz[:,1]
    z = xyz[:,2]

    fitfunc = lambda p, x, y, z: (- np.cos(p[3])*(p[0] - x) - z*np.cos(p[2])*np.sin(p[3]) - np.sin(p[2])*np.sin(p[3])*(p[1] - y))**2 + (z*np.sin(p[2]) - np.cos(p[2])*(p[1] - y))**2 #fit function
    errfunc = lambda p, x, y, z: fitfunc(p, x, y, z) - p[4]**2 #error function 

    est_p , success = leastsq(errfunc, p, args=(x, y, z), maxfev=1000)

    return est_p

if __name__=="__main__":

    np.set_printoptions(suppress=True)    
    xyz = np.loadtxt('cylinder11.xyz')
    #print xyz
    print "Initial Parameters: "
    p = np.array([-13.79,-8.45,0,0,0.3])
    print p
    print " "

    print "Performing Cylinder Fitting ... "
    est_p =  cylinderFitting(xyz,p,0.00001)
    print "Fitting Done!"
    print " "


    print "Estimated Parameters: "
    print est_p

关于python - 将圆柱体拟合到分散的 3D XYZ 点数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43784618/

相关文章:

python - 在python中构建具有不同大小的字符串列表的结构

python - 如何从位置参数增加文件名?

C语言字符数组三角形,字符之间用空格分隔

Python - OpenCV - 使用 HoughCircles 进行圆检测

python - 在 Python 中创建 xyz 高度数据的表面图

python - 在 matplotlib 中正确渲染 3dplot_surface

python - 点制 3D 表面的颜色

python - 在 Python 中覆盖基本信号(SIGINT、SIGQUIT、SIGKILL??)

python - 如何将 sass 安装到你的系统中(有或没有 ruby​​)

video - 在opencv的静止视频中检测到不一致的圆圈