我有来自现实世界的点云,我想在它们上面拟合并计算点的曲线(!)。 由于点在现实世界中,因此点的x,y和z之间的差异幅度非常大,当我使用here中的代码时,我在matlab中遇到以下错误:
Warning: Rank deficient, rank = 2, tol = 7.9630e-007.
这意味着我的数据状况不佳。 我的一些数据是:
32512032.3900000 5401399.69000000 347.030000000000
32512033.1400000 5401399.79000000 346.920000000000
32512036.3000000 5401399.62000000 346.840000000000
32512037.3900000 5401399.95000000 346.870000000000
32512034.4800000 5401400 346.930000000000
32512035.6000000 5401400.05000000 346.950000000000
32512036.6900000 5401400.38000000 346.980000000000
32512037.9600000 5401400.30000000 346.910000000000
32512033.7600000 5401400.42000000 346.880000000000
32512034.8700000 5401400.48000000 346.960000000000
我也在matlab中使用fit
公式。
sf = fit( [x, y], z, 'poly23');
并看到同样的错误:
Warning: Equation is badly conditioned. Remove repeated data points
or try centering and scaling.
这种类型的点是否适合曲面或平滑曲线?
答案 0 :(得分:3)
修改强>
您可以尝试:
定心
%% Centering
oldData = data
center = mean(data);
centerMatrix = ones(size(data,1),1)*center;
data = data - centerMatrix;
缩放
%% Scaling
scale = max(abs(data));
scaleMatrix = ones(size(data,1),1)*scale;
data = data./scaleMatrix;
但最后不要忘记。 。
xx = scale(1)*xx + center(1)
yy = scale(2)*yy + center(2)
zz = scale(3)*zz + center(3)
居中将数据移动到原点。缩放使得传播更加平等,因此您不能比其他轴更好地适应一个轴。之后你必须取消缩放和取消中心结果。
居中是安全的。它应该做你期望的,并使结果更稳定。 缩放不是安全的。确保它能满足你的需求;如果居中足够,你可能会发现这就是你所需要的。
在任何情况下,由于点云很大,您应该一次将其应用于本地补丁。
为什么我说“快而又肮脏?”我的意思是快速编码。有许多出版物专门处理这个问题,它们会跑得更快。他们会产生更好的结果吗?嗯,这取决于你定义的更好。
如果您正在谈论扫描激光,那么对于真实的扫描环境,没有很多地面实况数据。如果您的点云来自其他东西(立体视觉,运动结构),您可以尝试更多数据集。
没有事实真相,很难说“好”和“坏”是什么。通常很明显。但是由于数据量的原因,点云操纵并非易事。
旧答案 如果您想使用fit尝试快速而肮脏的解决方案,那么正确的中心就是我的建议。当然,您不能同时使用所有数据,但如果您只选择几个本地点(甚至几百或几千)并将其居中,那么您应该得到更好的结果。
问题正在发生,因为你的任何两点之间的差异很小,但矢量本身的大小非常大。如果您获取数据,将其居中(如果您愿意,您甚至可以进行缩放),然后您可以适应它并反转操作。一次为一块做这件事。