快速平面拟合到许多点

时间:2012-06-05 15:23:25

标签: performance matlab plane

我希望将飞机安装到一组约6-10k的3D点上。我希望尽可能快地做到这一点,准确性不是最关心的问题(坦白说,任何一个主轴上的飞机都可以偏离+ -10度)。

我目前的方法是使用最好的最佳拟合,但速度非常慢(我希望每次运行算法时以大约10-50k的速度提取平面,并且以此速率完成几周,而不是几小时)因为它适用于6000点的所有可能组合,所以~35,000,000,000次迭代,坦率地说它具有比我需要的更高的准确度。

有没有人知道任何较弱的平面拟合技术可能会大大提高我的算法速度?

编辑:

通过在每个可能的3D角度(每次踩到5度)创建平面并测试现有点以找到最佳平面而不是拟合,我设法将迭代次数降低到〜42k飞机到我所拥有的点。

我确信通过分裂和征服也可以获得一些东西,虽然我担心我可以直接跳过最好的飞机。

4 个答案:

答案 0 :(得分:13)

使用标准平面方程Ax + By + Cz + D = 0,并将方程式写为矩阵乘法。 P是您未知的4x1 [A;B;C;D]

g = [x y z 1];  % represent a point as an augmented row vector
g*P = 0;        % this point is on the plane

现在将此扩展为所有实际点,即Nx4矩阵G。结果不再是0,这是你试图最小化的错误。

G*P = E;   % E is a Nx1 vector

所以你想要的是距离G的零空间最近的向量,它可以从SVD中找到。我们来测试一下:

% Generate some test data
A = 2;
B = 3;
C = 2.5;
D = -1;

G = 10*rand(100, 2);  % x and y test points
% compute z from plane, add noise (zero-mean!)
G(:,3) = -(A*G(:,1) + B*G(:,2) + D) / C + 0.1*randn(100,1);

G(:,4) = ones(100,1);   % augment your matrix

[u s v] = svd(G, 0);
P = v(:,4);             % Last column is your plane equation

好的,记住P可以用标量变化。所以只是为了表明我们匹配:

scalar = 2*P./P(1);
P./scalar

ans =     2.0000     3.0038     2.5037    -0.9997

答案 1 :(得分:5)

在计算机视觉中,标准方法是在您的情况下使用RANSAC或MSAC;

  1. 从人口中取3个随机点
  2. 计算由3点
  3. 定义的平面
  4. 对该平面的所有点的误差(到平面的距离)求和。
  5. 保留显示最小错误总和的3个点(并且在阈值范围内)。
  6. 重复N次迭代(参见RANSAC理论选择N,我可以建议50吗?)
  7. http://en.wikipedia.org/wiki/RANSAC

答案 2 :(得分:1)

看起来griddata可能就是你想要的。该链接有一个例子。

如果这不起作用,可以在MATLAB文件交换中查看gridfit。它是为了匹配比griddata更常见的情况。

你可能不想滚动自己的表面贴合,因为那里有几个记录良好的工具。

griddata

为例
x = % some values 
y = % some values
z = % function values to fit to

ti = % this range should probably be greater than or equal to your x,y test values
[xq,yq] = meshgrid(ti,ti);
zq = griddata(x,y,z,xq,yq,'linear'); % NOTE: linear will fit to a plane!
Plot the gridded data along with the scattered data.

mesh(xq,yq,zq), hold
plot3(x,y,z,'o'), hold off

答案 3 :(得分:0)

您可以尝试John D'Errico的consolidator。它聚合给定容差内的点,这将允许减少数据量并提高速度。您还可以查看约翰的gridfit函数,该函数通常比griddata更快,更灵活