【问题标题】:How can I fit a surface on 3D point cloud in matlab?如何在 matlab 中将曲面拟合到 3D 点云上?
【发布时间】:2023-03-19 08:28:01
【问题描述】:

我有一个来自现实世界的点云,我想在它们上面拟合一个曲面并计算点的曲线(!)。 因为点在现实世界中,所以点的 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.

是否有一种方法可以在此类点上拟合曲面或平滑曲线?

【问题讨论】:

标签: matlab curve-fitting curve


【解决方案1】:

编辑

你可以试试:

居中

%% 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 的快速而肮脏的解决方案,那么居中正是我的建议。当然,您不能一次对所有数据执行此操作,但如果您只选择几个局部点(甚至几百或几千个)并首先将其居中,您应该会得到更好的结果。

之所以出现问题,是因为您的任何两个点之间的差异很小,但向量本身的大小却很大。如果您获取数据,将其居中(您甚至可以根据需要进行缩放),然后您可以对其进行拟合并反转操作。一次做一大块。

【讨论】:

  • 谢谢@timbo。我将数据居中,我可以看到结果。但我不知道什么是居中?为什么脏?居中会破坏我的数据吗?
猜你喜欢
  • 2021-11-19
  • 2021-03-02
  • 1970-01-01
  • 2017-01-02
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多