在前文中利用pcl官网的代码构建了AABB与OBB包围盒。但是后面发现一个问题,在官网给定的点云可以构建,但是自己的点云却不能构建。原因尚未查询。后面 在网上查找到利用PCA进行构建包围盒。
注:
本文着重讲解的是PCA的原理,代码可以在参考文章中找到。文章中很多公式在word编辑完成,并未在博客中再次编辑,望见谅。
参考的文章:https://blog.csdn.net/qq_16775293/article/details/82801240
首先说一下边界体的概念。边界体是用来包围一个三角网格的所有顶点,也就是将所有的三角形包围在边界体内部。同样的包围盒也是类似的将所有的点包围在一个盒子中,这个盒子也分为很多种:AABB包围盒、OBB包围盒、包围球等。本章主要讲的是OBB包围盒。
PCA(Principal Component Analysis)主成分分析
主成分分析可以用来计算有多个变量组成的数据集的坐标系空间,数据集的多个变量可以分成多个不相关分量,存在一个顶点位置数组中的x,y,z坐标值就是这样的数据集(点云)。数据集中最不同的方向表示主分量的基本主元。
将每个点设为,点云就看作
N个点构成的数据集。首先利用以下公式计算位置平均数m
在构建一个协方差矩阵C,
协方差矩阵是由以下六个元素组成的对称矩阵:
协方差矩阵表示x,y,z坐标值之间的相互关系。若这三个坐标值两两无关,则他们在协方差矩阵上元素的值为0,为了将所有的点集中均匀的沿着坐标轴分布,需要将协方差矩阵转换成对角阵。我们可以利用线性代数里面的内容:
以作为该对象自然轴对应的方向,下面计算出从顶点沿X、Y、Z三个方向最大和最小位置,根据这些最大值和最小值可以容易的构建出边界盒的六个平面。
为了确定最大和最小的范围,可以通过计算每个顶点位置坐标与单位向量的内积来完成。边界盒的6个平面分别为:
边界盒的尺寸就是X,Y,Z三个方向上相应内积的最大值与最小值之差,边界盒的中心O就是三对反向平面中三个平面的交点,令a,b,c分别为X,Y,Z上最大值与最小值的平均值:
代码原理在参考的文章中原理简述部分已经说明,在此不再赘述。
PCA在很多地方还可以用到,笔者觉得了协方差矩阵、特征值、特征向量的几何意义是理解PCA的关键。上述代码中还用到四元数,四元数主要用于旋转变化,在后面会再写一篇文章简述一下。
最终代码测试的结果: