这次我们将学会怎么使用pcl::MomentOfInertiaEstimation 这个类来获取以惯性矩和偏心距为基础的描述器。这个类也能提取坐标对称和定向包围的方形盒子。但是记住导出的OBB不是最小可能性的盒子。
下面介绍了该种方法的特征提取方式。第一次先算出点云矩阵的协方差,计算它的特征值和特征向量。然后把特征向量进行归一化处理,并把它组成右手坐标系。每一步都会迭代一次。每一次迭代特征向量都会旋转。选转的顺序总是一样的,总是被别的特征向量执行。这提供了选择不变性。我们把这个旋转的主向量作为当前的坐标系。
对于每一个惯性矩都会被计算。此外,当前的坐标系还被用于偏心距的计算。出于这个原因,当前的向量被当成一个平面的法线向量同时点云被投射到这个向量上。对于这个投射,偏心距会被计算。
完成上述实现的类还提供了方法来获得AABB和OBB。旋转的方形盒子被当做AABB和特征向量一起计算。
下面是一段代码
#include <pcl/features/moment_of_inertia_estimation.h> #include <vector> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/visualization/cloud_viewer.h> #include <boost/thread/thread.hpp> int main (int argc, char** argv) { if (argc != 2) return (0);boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer")); viewer->setBackgroundColor (0, 0, 0); viewer->addCoordinateSystem (1.0); viewer->initCameraParameters (); viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud"); viewer->addCube (min_point_AABB.x, max_point_AABB.x, min_point_AABB.y, max_point_AABB.y, min_point_AABB.z, max_point_AABB.z, 1.0, 1.0, 0.0, "AABB");pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ()); if (pcl::io::loadPCDFile (argv[1], *cloud) == -1) return (-1); pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor; feature_extractor.setInputCloud (cloud); feature_extractor.compute (); std::vector <float> moment_of_inertia; std::vector <float> eccentricity; pcl::PointXYZ min_point_AABB; pcl::PointXYZ max_point_AABB; pcl::PointXY