PCA构建点云包围盒

评价:文章主要讲解PCA生成包围盒的原理,PCA计算点云的特征向量和特征值可以使用C++编程直接实现,也可以使用PCL点云库,或者使用Python的numpy函数实现。

注:

本文着重讲解的是PCA的原理,代码可以在参考文章中找到。文章中很多公式在word编辑完成,并未在博客中再次编辑,望见谅。

参考的文章:https://blog.****.net/qq_16775293/article/details/82801240

首先说一下边界体的概念。边界体是用来包围一个三角网格的所有顶点,也就是将所有的三角形包围在边界体内部。同样的包围盒也是类似的将所有的点包围在一个盒子中,这个盒子也分为很多种:AABB包围盒、OBB包围盒、包围球等。本章主要讲的是OBB包围盒。

PCA(Principal Component Analysis)主成分分析

主成分分析可以用来计算有多个变量组成的数据集的坐标系空间,数据集的多个变量可以分成多个不相关分量,存在一个顶点位置数组中的x,y,z坐标值就是这样的数据集(点云)。数据集中最不同的方向表示主分量的基本主元。

将每个点设为PCA构建点云包围盒,点云就看作PCA构建点云包围盒 N个点构成的数据集。首先利用以下公式计算位置平均数m

PCA构建点云包围盒

在构建一个协方差矩阵C,

PCA构建点云包围盒

协方差矩阵是由以下六个元素组成的对称矩阵:

PCA构建点云包围盒

协方差矩阵表示x,y,z坐标值之间的相互关系。若这三个坐标值两两无关,则他们在协方差矩阵上元素的值为0,为了将所有的点集中均匀的沿着坐标轴分布,需要将协方差矩阵转换成对角阵。我们可以利用线性代数里面的内容:

PCA构建点云包围盒

            以PCA构建点云包围盒作为该对象自然轴对应的方向,下面计算出从顶点沿X、Y、Z三个方向最大和最小位置,根据这些最大值和最小值可以容易的构建出边界盒的六个平面。

为了确定最大和最小的范围,可以通过计算每个顶点位置坐标PCA构建点云包围盒与单位向量的内积来完成。边界盒的6个平面分别为:

PCA构建点云包围盒

边界盒的尺寸就是X,Y,Z三个方向上相应内积的最大值与最小值之差,边界盒的中心O就是三对反向平面中三个平面的交点,令a,b,c分别为X,Y,Z上最大值与最小值的平均值:

PCA构建点云包围盒

PCA构建点云包围盒

代码原理在参考的文章中原理简述部分已经说明,在此不再赘述。

PCA在很多地方还可以用到,笔者觉得了协方差矩阵、特征值、特征向量的几何意义是理解PCA的关键。上述代码中还用到四元数,四元数主要用于旋转变化,在后面会再写一篇文章简述一下。

最终代码测试的结果:

PCA构建点云包围盒