python三维数据点拟合平面_3D平面拟合方法(C ++与Python)

importnumpyasnpimportscipy.optimizefrommpl_toolkits.mplot3dimportAxes3Dimportmatplotlib.pyplotaspltimportpandas

fig=plt.figure()ax=fig.gca(projection='3d')deffitPlaneLTSQ(XYZ):(rows,cols)=XYZ.shapeprint(rows,cols)G=np.ones((rows,3))print(XYZ)print(XYZ[0])G[:,0]=XYZ[0]# XG[:,1]=XYZ[1]# Yprint(G)Z=XYZ[2](a,b,c),resid,rank,s=np.linalg.lstsq(G,Z)print("a : ",a)print("b : ",b)print("c : ",c)print("Residual : ",resid)print("Rank : ",rank)print("Singular Value",s)normal=(a,b,-1)# I Don't Know WHY ?print("normal : ",normal)'''

normala = abs(pow(a,2)+pow(b,2)+pow(-1,2))

np.sqrt(normala)

abb=normal/normala

print("Normala : ",normala)

print("Normala : ", abb)

'''nn=np.linalg.norm(normal)# I Don't Know WHY ?print("nn : ",nn)normal=normal/nn# I Don't Know WHY ?print("Normal : ",normal)return(c,normal)#Import Data from CSVresult=pandas.read_csv("C:/Users/Logs/points_L.csv",header=None)# , names=['X', 'Y','Z']#result =result.head(5)print(result)normal1=pandas.read_csv("C:/Users/Logs/pose_left.csv",header=None)# , names=['X', 'Y','Z']print(normal1)abc=pandas.read_csv("C:/Users/Logs/abc.csv",header=None)# , names=['X', 'Y','Z']print(abc)#standard normal distribution / Bell.#np.random.seed(seed=1)data=result#print(data)print("NEW : ")print(data)c,normal=fitPlaneLTSQ(data)print(c,normal)# plot fitted planemaxx=np.max(data[0])maxy=np.max(data[1])minx=np.min(data[0])miny=np.min(data[1])print(maxx,maxy,minx,miny)point=np.array([0.0,0.0,c])# I Don't Know WHY ?print("Point : ",point)d=-point.dot(normal)# I Don't Know WHY ?print("D : ",d)# plot original pointsax.scatter(data[0],data[1],data[2])ax.quiver(data[0],data[1],data[2],normal1[0],normal1[1],normal1[2],length=0.2)# compute needed points for plane plottingxx,yy=np.meshgrid([minx,maxx],[miny,maxy])print(xx)print(yy)print("minx : ",minx)print("maxx : ",maxx)print("miny : ",miny)print("maxy : ",maxy)print("xx : ",xx)print("yy : ",yy)z=(-normal[0]*xx-normal[1]*yy-d)*1./normal[2]# I Don't Know WHY ?unit1=np.sqrt(pow(normal[0],2)+pow(normal[1],2)+pow(normal[2],2))print("Unit 1 : ",unit1)Error=abs(normal[0]*data[0]+normal[1]*data[1]+normal[2]*data[2]+d)/unit1print("Error",Error)Error_F=pandas.DataFrame(Error)print("Print : ",Error_F)Error_F.to_csv("C:/Users/Logs/Py_Error.csv")print("Z : ",z)# plot planeax.plot_surface(xx,yy,z,alpha=0.2)ax.set_xlim(-1,1)ax.set_ylim(-1,1)ax.set_zlim(1,2)ax.set_xlabel('x')ax.set_ylabel('y')ax.set_zlabel('z')plt.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最小二乘法(OLS)是一种常见的拟合方法,可以用于三维坐标拟合平面和多维数据拟合直线。 对于三维坐标拟合平面,我们可以使用以下步骤: 1. 收集三维坐标数据(x,y,z)。 2. 计算每个坐标的x、y、z值的平均值。 3. 计算每个坐标的偏差(xi-xavg,yi-yavg,zi-zavg)。 4. 计算协方差矩阵,并计算其特征值和特征向量。 5. 特征向量中的最小特征值对应平面的法向量,可以通过向量归一化获得。 6. 通过法向量和平面上的任意一计算平面方程。 下是一个Python示例代码: ```python import numpy as np # 生成一些数据 x = np.array([1, 2, 3, 4, 5]) y = np.array([2, 3, 4, 5, 6]) z = np.array([1, 1, 2, 2, 3]) # 计算坐标平均值 x_avg = np.mean(x) y_avg = np.mean(y) z_avg = np.mean(z) # 计算偏差 dx = x - x_avg dy = y - y_avg dz = z - z_avg # 计算协方差矩阵 cov_matrix = np.cov([dx, dy, dz]) # 计算特征值和特征向量 eig_values, eig_vectors = np.linalg.eig(cov_matrix) # 获取最小特征值对应的特征向量 min_eig_vector = eig_vectors[:, np.argmin(eig_values)] # 归一化法向量 norm_vector = min_eig_vector / np.linalg.norm(min_eig_vector) # 计算平面方程 d = -np.dot(norm_vector, np.array([x_avg, y_avg, z_avg])) plane_equation = np.append(norm_vector, d) print("平面方程:", plane_equation) ``` 对于多维数据拟合直线,步骤类似,只需要将平面方程计算替换为直线方程即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值