PCL:计算点云协方差矩阵

Posted 没事就要敲代码

tags:

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

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::computeCovarianceMatrix(*cloud, centeroid, covariance);

完整代码:

#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::compute3DCentroid(*cloud, centeroid);	//计算点云质心
	pcl::computeCovarianceMatrix(*cloud, centeroid, covariance);	//计算点云协方差矩阵
	cout << "\\n->点云质心为:" << endl;
	cout << centeroid << endl;
	cout << "\\n->点云的协方差矩阵为:" << endl;
	cout << covariance << endl;
	//================================================================


	return 0;
}

3 结果展示

->加载了 1348 个数据点

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

->点云的协方差矩阵为:
 27117.7 -5246.28  288.386
-5246.28  1017.85  -241.89
 288.386  -241.89  11977.3

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

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

使用矩阵变换点云

PCL点云处理之基于高程的粗糙度计算(一百)

PCL点云配准

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

PCL:compute3DCentroid ❤️ 计算点云质心