Matlab 最小二乘法 拟合平面 (PCL PCA拟合平面)

这篇具有很好参考价值的文章主要介绍了Matlab 最小二乘法 拟合平面 (PCL PCA拟合平面)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、原理推导

最小二乘法 拟合平面是我们最常用的拟合平面的方法,但是有特殊的情况是用这种方法是不能拟合的,后续会加上这种拟合方法(RANSAC)。

matlab 最小二乘拟合平面(方法一) - 灰信网(软件开发博客聚合)

平面方程:Ax+By+Cz+D=0;

matlab平面拟合,matlab,PCL,matlab,PCL

matlab平面拟合,matlab,PCL,matlab,PCL

 matlab平面拟合,matlab,PCL,matlab,PCL

二、Matlab 实现

1、随机出来一些离散的点

>> clear
>> close all
>> % 随机生成一组(x,y,z)这些点的坐标离一个平面比较近
>> x0=1;L1=2;
>> y0=1;L2=2;
>> x=x0+rand(20,1)*L1;
>> y=y0+rand(20,1)*L2;
>> z=1+2*x+3*y;
>> scatter3(x,y,z,'filled')

matlab平面拟合,matlab,PCL,matlab,PCL  

2、将其写成矩阵的形式:

matlab平面拟合,matlab,PCL,matlab,PCL

matlab平面拟合,matlab,PCL,matlab,PCL

x_a=sum(x)/length(data);% length(data)==20
y_a=sum(y)/length(data);
z_a=sum(z)/length(data);

% 平方的均值====================================================
xx_a=sum(x.*x)/length(data);
yy_a=sum(y.*y)/length(data);
zz_a=sum(z.*z)/length(data);

xy_a=sum(x.*y)/length(data);
xz_a=sum(x.*z)/length(data);
yz_a=sum(y.*z)/length(data);

matlab平面拟合,matlab,PCL,matlab,PCL

 3、求出a0  a1 a2也就是 -A/C   -B/C   -D/C

b=[xz_a;yz_a;z_a];

XYZ=A^-1 *b;  % 方程求系数
a0=XYZ(1); % -A/C
a1=XYZ(2); % -B/C
a2=XYZ(3); % -D/C

4、求平面法向量

V=[a0 a1  -1];% 平面法向量
nor=norm(V); % 向量的模
normalize_V=[a0/nor  a2/nor  -1/nor]; % 平面法向量归一化

matlab平面拟合,matlab,PCL,matlab,PCL

5、 开始绘制图像

scatter3(x,y,z,'filled')
hold on;
xfit=min(x):0.1:max(x);  % 坐标系的坐标
yfit=min(y):0.1:max(y);
[XF,YF]=meshgrid(xfit,yfit);% 生产XY点列 

ZF=a0*XF+a1*YF+a2;  %计算Z的值

% 显示
mesh(XF,YF,ZF)

matlab平面拟合,matlab,PCL,matlab,PCL

clear
close all
% 随机生成一组(x,y,z)这些点的坐标离一个平面比较近
x0=1;L1=2;
y0=1;L2=2;
x=x0+rand(20,1)*L1;
y=y0+rand(20,1)*L2;
z=1+2*x+3*y;
scatter3(x,y,z,'filled')
hold on;
data=[x,y,z];
x=data(:,1);
y=data(:,2);
z=data(:,3);
x_a=sum(x)/length(data);% length(data)==20
y_a=sum(y)/length(data);
z_a=sum(z)/length(data);

% 平方的均值====================================================
xx_a=sum(x.*x)/length(data);
yy_a=sum(y.*y)/length(data);
zz_a=sum(z.*z)/length(data);

xy_a=sum(x.*y)/length(data);
xz_a=sum(x.*z)/length(data);
yz_a=sum(y.*z)/length(data);


% 方程组的系数矩阵
A=[xx_a  xy_a  x_a;
   xy_a  yy_a  y_a;
   x_a   y_a    1];

b=[xz_a;yz_a;z_a];

XYZ=A^-1 *b;  % 方程求系数
a0=XYZ(1); % -A/C
a1=XYZ(2); % -B/C
a2=XYZ(3); % -D/C

V=[a0 a1  -1];% 平面法向量
nor=norm(V); % 向量的模
normalize_V=[a0/nor  a2/nor  -1/nor]; % 平面法向量归一化


% 开始绘制图像
scatter3(x,y,z,'filled')
hold on;
xfit=min(x):0.1:max(x);  % 坐标系的坐标
yfit=min(y):0.1:max(y);
[XF,YF]=meshgrid(xfit,yfit);% 生产XY点列 

ZF=a0*XF+a1*YF+a2;  %计算Z的值

% 显示
mesh(XF,YF,ZF)





三维点集拟合:平面拟合、RANSAC、ICP算法_wishchin的博客-CSDN博客_三维曲面拟合算法

 PCL 基于PCA的平面拟合

matlab平面拟合,matlab,PCL,matlab,PCL文章来源地址https://www.toymoban.com/news/detail-572050.html

 PCL的setIndices 函数

template <typename PointT> void
pcl::PCLBase<PointT>::setIndices (size_t row_start, size_t col_start, size_t nb_rows, size_t nb_cols)
{
  if ((nb_rows > input_->height) || (row_start > input_->height))
  {
    PCL_ERROR ("[PCLBase::setIndices] cloud is only %d height", input_->height);
    return;
  }

  if ((nb_cols > input_->width) || (col_start > input_->width))
  {
    PCL_ERROR ("[PCLBase::setIndices] cloud is only %d width", input_->width);
    return;
  }

  size_t row_end = row_start + nb_rows;
  if (row_end > input_->height)
  {
    PCL_ERROR ("[PCLBase::setIndices] %d is out of rows range %d", row_end, input_->height);
    return;
  }

  size_t col_end = col_start + nb_cols;
  if (col_end > input_->width)
  {
    PCL_ERROR ("[PCLBase::setIndices] %d is out of columns range %d", col_end, input_->width);
    return;
  }

  indices_.reset (new std::vector<int>);
  indices_->reserve (nb_cols * nb_rows);
  for(size_t i = row_start; i < row_end; i++)
    for(size_t j = col_start; j < col_end; j++)
      indices_->push_back (static_cast<int> ((i * input_->width) + j));
  fake_indices_ = false;
  use_indices_  = true;
}

#if 1  //  PCA的平面拟合

int main()
{
	// Findnowd();
	string  path = "C:\\Users\\Albert\\Desktop\\pcd\\plane.pcd";
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 创建点云(指针)

	if (pcl::io::loadPCDFile<pcl::PointXYZ>(path, *cloud) == -1) //* 读入PCD格式的文件,如果文件不存在,返回-1
	{
		PCL_ERROR("Couldn't read file test_pcd.pcd \n"); //文件不存在时,返回错误,终止程序。
		return 0;
	}

	cout << " 点云的大小 : " << cloud->size() << endl;


	pcl::PCA<pcl::PointXYZ> pca;
	pca.setInputCloud(cloud);
	Eigen::Matrix3f  ve=pca.getEigenVectors();
	cout << "矩阵:" << endl;
	cout << ve << endl;

	float  A, B, C, D;
	A = ve.col(2).row(0).value();
	B = ve.col(2).row(1).value();
	C = ve.col(2).row(2).value();

	cout << "平面参数:    " << endl;
	cout << "  A:" << A << endl;
	cout << "  B:" << B << endl;
	cout << "  C:" << C << endl;


	//计算点云的质心
	Eigen::Vector4d centroid;
	pcl::compute3DCentroid(*cloud, centroid);

	D = -(A * centroid[0] + B * centroid[1] + C * centroid[2]);
	cout << "  D:" << D << endl;

	


	system("pause");
	return (0);

}
#endif 

到了这里,关于Matlab 最小二乘法 拟合平面 (PCL PCA拟合平面)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MATLAB RANSAC平面拟合 (29)

    将一个平面与一个从内点到平面的最大允许距离的点云相匹配。该函数返回描述平面的几何模型。该函数采用 M- 估计量样本一致性(MSAC)算法求解平面。MSAC 算法是随机样本一致性(RANSAC)算法的一个变体。 对具体的函数和内部参数进行介绍说明 model = pcfitplane(ptCloudIn,maxDistance)

    2024年02月15日
    浏览(32)
  • pcl matlab 计算平面与空间三角形的交线

     过程: 单有法向量不能确定一个平面,至少还要有平面上的一个点的坐标才行 假如知道法向量n=(A,B,C) 而平面过某点M=(x0,y0,z0) 那么平面的方程为 A(x-x0)+B(y-y0)+C(z-z0)=0 要在图中画出来,那么先要给x,y一个范围 举个离子,平面法向量(1,1,1)过点(0,1,2) 画出x,y在 -2~2区

    2024年02月12日
    浏览(48)
  • 将多组三维点拟合成平面方程MATLAB

    将三维点拟合成平面方程可以使用最小二乘法。最小二乘法可以找到最优的平面模型,使得拟合的平面与给定的三维点之间的误差最小化。 以下是一个示例,演示如何使用最小二乘法将一组离散的三维点拟合成平面方程: 这段代码实现了将三维点拟合成平面方程,逐行解释

    2024年02月07日
    浏览(38)
  • PCL RANSAC拟合平面(C++详细过程版)

    本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。   RANSAC拟合平面,采用的是不共线的三个点确定一个平面,据以实现原理见:PCL 三点确定一个平面原理及代码

    2024年02月13日
    浏览(38)
  • 故障诊断 | 一文解决,PLS偏最小二乘法的故障诊断(Matlab)

    故障诊断 | 一文解决,PLS偏最小二乘法的故障诊断(Matlab) 偏最小二乘法(Partial Least Squares, PLS)是一种统计建模方法,用于建立变量之间的线性关系模型。它是对多元线性回归方法的扩展,特别适用于处理高维数据和具有多重共线性的数据集。 PLS的主要目标是通过找到输入

    2024年04月12日
    浏览(46)
  • 【数学建模笔记】【第四讲(1)】拟合算法之最小二乘算法及其MATLAB实现

    与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数(曲线),使得该曲线在某种准则下与所 有的数据点最为接近,即曲线拟合的最好(最小化损失函数) 【插值和拟合的区别】 插值算法中,得到的多项式f(x)要经过所有样本点。但

    2024年02月09日
    浏览(49)
  • 拟合算法之最小二乘法

    与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是追求一个函数(曲线),使得该曲线在某种准测下与所有的数据点最为接近,即曲线拟合最好(最小化损失函数)。 插值算法中,得到的多项式f(x)要经过所有的样本点。但是如果样本点太多,

    2024年02月04日
    浏览(58)
  • 切比雪夫(最小区域法)平面拟合算法

    欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 本期话题:切比雪夫(最小区域法)平面拟合算法 相关背景和理论 点击前往 主要介绍了应用背景和如何转化成线性规划问题 10到631个点,全部采样自平面附近。 每个点3个坐标,坐标精确到小数点

    2024年03月28日
    浏览(88)
  • 数值分析——曲线拟合的最小二乘法

    拟合曲线定义:求近似函数 φ(x), 使之 “最好” 的逼近f(x) ,无需满足插值原则. 这就是曲线拟合问题。 (时间紧迫直接看例子就行,智慧交通专业的补修课,可能理论学的不那么深入,主要是方法。) 超定方程组 是指方程个数大于未知量个数的方程组 。 最小二乘解 : 对于

    2024年02月09日
    浏览(44)
  • 最小二乘法的几种拟合函数

    目录 1.最小二乘法的原理和解决的问题 2.最小二乘法的公式解法 2.1  拟合h(x) = a * x 2.2 拟合 h(x) = a0 + a1*x 2.3拟合 h(x) = a0 + a1 *x + a3 * x^3  因为采用矩阵法来进行最小二乘法的函数拟合时,会出现系数矩阵的逆矩阵不存在的情况有一定的局限性,所以本篇对公式法进行简单说明

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包