PCL:计算点云的标准化(normalized)协方差矩阵

Posted 没事就要敲代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PCL:计算点云的标准化(normalized)协方差矩阵相关的知识,希望对你有一定的参考价值。

1 原理

对于点云中的每个点 p i p_i pi,对应的协方差矩阵 C C C 如下:
C = 1 N ⋅ ∑ i = 1 N ⋅ ( p i − p ‾ ) ⋅ ( p i − p ‾ ) T C=\\cfrac {1}{N}·\\sum_{i=1}^{N}·\\left(p_i-\\overline p\\right)·\\left(p_i-\\overline p\\right)^T C=N1i=1N(pip)(pip)T
C ⋅ V j ⃗ = λ j ⋅ V j ⃗ , j ∈ 0 , 1 , 2 C·\\vec{V_j}=\\lambda_j·\\vec{V_j},j∈{0,1,2} CVj =λjVj j012

式中, N N N 为点云中点的个数, p ‾ \\overline p p 为点云质心, λ j \\lambda_j λj 为协方差矩阵的第 j j j 个特征值, V j ⃗ \\vec{V_j} Vj 为第 j j j 个特征向量

点云的标准化协方差矩阵就是指将协方差矩阵的每一个元素除以点的个数

此方法在理论上是准确的。但是,使用浮点进行内部计算会降低精度,但会提高效率。

2 代码实现

关键代码:

给定输入点云,输出标准化的协方差矩阵和点云质心

pcl::computeMeanAndCovarianceMatrix(*cloud, covariance, centeroid);

完整代码:

#include <iostream>
#include <pcl\\io\\pcd_io.h>
#include <pcl\\common\\centroid.h>	//定义了中心点的估算以及协方差矩阵的计算

using namespace std;

typedef pcl::PointXYZ PointT;

int main()
{
	//---------------------------- 加载点云 --------------------------
	pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
	if (pcl::io::loadPCDFile("test.pcd", *cloud) < 0)
	{
		PCL_ERROR("->点云文件不存在!\\a\\n");
		system("pause");
		return -1;
	}
	cout << "->加载了 " << cloud->points.size() << " 个数据点" << endl;
	//================================================================


	//--------------------- 计算点云标准化协方差矩阵 -------------------
	Eigen::Matrix3f covariance;					//创建存储3×3协方差矩阵的对象
	Eigen::Vector4f centeroid;					//创建存储点云质心的对象
	pcl::computeMeanAndCovarianceMatrix(*cloud, covariance, centeroid);
	cout << "\\n->点云的协方差矩阵为:" << endl;
	cout << covariance << endl;
	cout << "\\n->点云质心为:" << endl;
	cout << centeroid << endl;
	//================================================================


	return 0;
}

3 结果展示

->加载了 1348 个数据点

->点云的协方差矩阵为:
   20.117   -3.8919   0.21394
  -3.8919  0.755084 -0.179444
  0.21394 -0.179444   8.88523

->点云质心为:
6.86964
1.52943
3.56691
      1

以上是关于PCL:计算点云的标准化(normalized)协方差矩阵的主要内容,如果未能解决你的问题,请参考以下文章

PCL:计算点云均值与标准差

PCL 3维点云的模板匹配

PCL:点云赋色 | 自定义点云中任意一点的颜色

PCL点云配准

pcl中的一些常用函数记录笔记

3D点云的快速分割:自动驾驶汽车应用的LiDAR处理实例