matlab怎么将点云数据用最小二乘方法拟合出平面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab怎么将点云数据用最小二乘方法拟合出平面相关的知识,希望对你有一定的参考价值。

数据已经导进去了

本人小白,求助各位matlab大神

%点X,Y,Z到平面Ax+By+Cz+D=0的距离为
%d(ABCD,XYZ)=|AX+BY+CZ+D|/sqrt(A^2+B^2+C^2)
%ABCD四个变量只有三个是互相独立的
%设A=cos(a);B=sin(a)*cos(b);C=sin(a)*sin(b)
%那么A^2+B^2+C^2=1,距离公式化简为
%d(abc,XYZ)=|cos(a)*X+sin(a)*cos(b)*Y+sin(a)*sin(b)*Z+c|
%现在有已知点序列X,Y,Z,求参数 a b c
%先构造一个函数fun(p) 输入参数为p,其中p(1)=a,p(2)=b,p(3)=c
%使用 lsqnonlin求得p,使得sum((fun(p))^2)最小

fun=@(p) cos(p(1))*X+sin(p(1))*cos(p(2))*Y+sin(p(1))*sin(p(2))*Z+p(3);
p = lsqnonlin(fun,[0 0 0]);
A=cos(p(1));B=sin(p(1))*cos(p(2));C=sin(p(1))*sin(p(2));D=p(3);追问

感谢大神~~~请问这个能加一条语句显示点云与拟合平面的图像吗?

追答

其实其他两个回答也是对的,只是不能满足一些特殊情况
WM_THU的回答,在D=0时,会有问题
tianxiawulang的回答在 C=0时,也会有问题

一般情况下,如果确保平面不是和z轴平行的话,
还希望画出图像,用tianxiawulang的会简便一点

fun=@(p,x,y) p(1)*x+p(2)*y+p(3);
para=lsqcurvefit(@(p,data) fun(p,data(:,1),data(:,2)),[1 1 1],[X Y],Z);
%拟合为 Z=para(1)*X+para(2)*Y+para(3)
plot3(X,Y,Z,'.');hold on;
h=ezsurf(@(x,y)fun(para,x,y),[min(X) max(X) min(Y) max(Y)]); hold off;
set(h,'edgecolor','none','facealpha',0.3,'FaceColor','r');

参考技术A

[线性解法]:

设平面方程aX+bY+cZ+d=0, 两边同除以d,有:aX+bY+cZ = -1

然后就可以做线性最小二乘了:

H = [X Y Z];
Y = -ones(size(X));
P = H\\Y;

得到的P是一个长度3的向量,分别是[a; b; c]

参考技术B

代码供参考(你只需要最后两行):

% 生成测试数据
X = randn(5241,1);
Y = randn(5241,1);
% 平面方程
Z = -0.5*X+0.6*Y+0.7;
% 数据加入噪声
Z = Z + randn(5241,1)*0.1;

% 数据拟合
f=inline('c(1)*x(:,1)+c(2)*x(:,2)+c(3)','c','x');
c=lsqcurvefit(f,[1 1 1],[X Y],Z)

以上是关于matlab怎么将点云数据用最小二乘方法拟合出平面的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB点云处理(十八):直线拟合(最小二乘 | RANSAC)

最优化案例整理

MATLAB点云处理(十七):最小二乘多项式曲线拟合

matlab 二维数据点 光滑曲线

点云二维格网的建立❤️原理与实现

PCL最小二乘法进行平面拟合原理