2D平面拟合,RANSAC,Matlab,链接

4

我有一组3D点。

Points_[x,y,z]% n*3 where n is number of points

我希望能够拟合一个平面(即地面),并检查平面的高度。我认为这是一个二维问题。

z=bo+b1x+b2y;

我找不到2D RANSAC平面拟合的链接。请问有人可以提供这个链接或文件吗?

其次,一些商业软件会给出平面的高度值。这是指实际高度还是某个复杂值?

谢谢!


我不清楚你在问什么。飞机有无限的宽度和长度,但没有高度。然而,这里有一个2D RANSAC实现:http://www.visual-experiments.com/demo/ransac.js/ - Elle
除非他期望有很多错误的测量数据,否则RANSAC似乎有些过头了。老实可靠的线性最小二乘法应该完全可以胜任。 - JonB
1个回答

1
如果您形成以下“ A”矩阵:
A = [ones(numel(Points_X),1), Points_X(:), Points_Y(:)]; 

其中(:)表示将列向量转化(如果原本不是列向量)

然后你可以将方程写成经典的线性方程组形式:

A*b = Points_Z(:);

b = [b0; b1; b2],其中b是您要确定的参数的列向量。 这有一个经典的解决方案。

b=A\Points_Z(:)

或者 b=pinv(A)*Points_Z(:)

参见 mldivide 和 pinv 的帮助文档。

您必须有三个或更多不全在一条直线上的点。对于这样一个过度确定的系统,pinv 和 \ 基本上会产生相同的结果。如果它们几乎共线,使用 . 可能有一些优势。

b 中的 3 个参数基本上是平面高度相对于原点的高度、平面的 x 斜率和 y 斜率。如果您考虑一下,一个平面的“高度”就是您的 z 项。您可以谈论关于某个点(如原点)的高度。现在,如果您想要在采样点的质心处得到高度,则可以执行:

z_mean = [1 mean(Points_X(:) ) mean( Points_Y(:) )] * b

这可能只是等同于mean( Points_Z(:) )。为了使定义有意义,您需要确保在感兴趣的区域上有一个均匀间隔的网格。
根据您的应用程序,可能会有其他定义。例如,如果您试图找到房间中心的高度,并在墙壁和内部采样点,则将平均值替换为中位数可能更合适。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接