将MATLAB中的CircleFitByKasa转换为Python



亲爱的:我没有使用MATLAB的经验,但有一些使用Python的经验。我正在尝试将MATLABCircleFitByKasa函数翻译成Python。

CircleFitByKasa功能具有以下代码:

function Par = CircleFitByKasa(XY)
%--------------------------------------------------------------------------
%  
%     Simple algebraic circle fit (Kasa method)
%      I. Kasa, "A curve fitting procedure and its error analysis",
%      IEEE Trans. Inst. Meas., Vol. 25, pages 8-14, (1976)
%
%     Input:  XY(n,2) is the array of coordinates of n points x(i)=XY(i,1), y(i)=XY(i,2)
%
%     Output: Par = [a b R] is the fitting circle:
%                           center (a,b) and radius R
%
%--------------------------------------------------------------------------
P = [XY ones(size(XY,1),1)]  [XY(:,1).^2 + XY(:,2).^2];
Par = [P(1)/2 , P(2)/2 , sqrt((P(1)^2+P(2)^2)/4+P(3))];
end   %  CircleFitByKasa

我已经为同一个MATLAB函数翻译了两个python代码,python代码如下所示。

import numpy as np
import os
import sys
import open3d as o3d
import math
pcd = o3d.io.read_point_cloud('C:\Users\wilso\python\datasets\PCD\rail_pcd_points.pcd')
XY=np.asarray(pcd.points)[:,:2]
def circiebykasa1(XY):
P=np.linalg.solve(np.concatenate((XY, np.ones((len(XY),1))), axis=1), (XY[:,0]**2 + XY[:,1]**2))
Par=(P[0]/2 , P[1]/2 , np.sqrt((np.power(P[0],2)+np.power(P[1],2))/4+P[2]))
return Par
def circiebykasa2(XY):
P=np.linalg.lstsq(np.concatenate((XY, np.ones((len(XY),1))), axis=1),(np.power(XY[:,0],2) + np.power(XY[:,1],2)))
Par=(P[0]/2 , P[1]/2 , np.sqrt((np.power(P[0],2)+np.power(P[1],2))/4+P[2]))
return Par

翻译后的Python代码可以在没有任何回溯的情况下运行,但结果似乎有点让我难以理解。根据MATLAB代码中的注释,MATLAB函数应该返回拟合圆的中心(a,b)和半径r;因此,我假设abr应该是单个数字(因为输入数组(XY)是2D(。然而,我翻译的Python函数都显示了以下结果。

(array([ -49.44680817,  -65.29780001, -974.3765832 ]),
array([1.47859859e+09]),
array([1.47859859e+09, 1.47859859e+09, 1.47859859e+09]))

根据结果,我的参数ar是三维坐标,没有太大意义。有谁能看一看,告诉我哪里做错了吗?

函数numpy.linalg.lstsq((返回的不仅仅是最小二乘解。

我认为改变这个:

Par=(P[0]/2 , P[1]/2 , np.sqrt((np.power(P[0],2)+np.power(P[1],2))/4+P[2]))

到此:

Par=(P[0][0]/2 , P[0][1]/2 , np.sqrt((np.power(P[0][0],2)+np.power(P[0][1],2))/4+P[0][2]))

应该修复它。但我不能检查,因为我没有你的数据。

相关内容

  • 没有找到相关文章

最新更新