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

数据已经导进去了本人小白,求助各位matlab大神... 数据已经导进去了

本人小白,求助各位matlab大神
展开
 我来答
dukinkin
推荐于2017-12-16 · TA获得超过1.3万个赞
知道大有可为答主
回答量:2444
采纳率:90%
帮助的人:926万
展开全部
%点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');
WM_THU
2014-01-08 · TA获得超过7164个赞
知道大有可为答主
回答量:4285
采纳率:80%
帮助的人:3919万
展开全部

[线性解法]:

设平面方程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]

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tianxiawulang
2014-01-08 · TA获得超过2.7万个赞
知道大有可为答主
回答量:4732
采纳率:89%
帮助的人:2633万
展开全部

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

% 生成测试数据
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)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式