基于惯性和偏心的描述符矩(Moment of inertia and eccentricity based descriptors)

在本教程中,我们将学习如何使用pcl::MomentOfInertiaEstimation类来获取基于偏心率惯性矩的描述符。这个类还允许提取云的轴对齐和定向的边界框。但请记住,提取的OBB不是最小可能的边界框。

#理论引入
特征提取方法的思想如下。首先计算点云的协方差矩阵,并提取其特征值和向量。你可以认为合成的特征向量是归一化的,总是形成右手坐标系(主特征向量代表X轴,次向量代表Z轴)。在下一步迭代过程发生。在每次迭代中,主要特征向量被旋转。旋转顺序总是相同的,并围绕其他特征向量执行,这为点云的旋转提供了不变性。今后,我们将把这个旋转的主矢量作为当前轴。
_images / eigen_vectors.png
计算每个当前轴的转动惯量。 此外,目前的轴也用于偏心计算。 出于这个原因,目前矢量被视为平面的法向量,并将输入云投影到其上。 之后,计算得到的投影的偏心率。
_images/projected_cloud.png
实现类还提供获取AABB和OBB的方法。面向对象的边界框沿着特征向量计算为AABB。
#代码
首先,您将需要本教程的点云。 这是截图中的一个。接下来,您需要做的是在您喜欢的任何编辑器中创建一个moment_of_inertia.cpp文件,并在其中复制下面的代码:

#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);

  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::PointXYZ min_point_OBB;
  pcl::PointXYZ max_point_OBB;
  pcl::PointXYZ position_OBB;
  Eigen::Matrix3f rotational_matrix_OBB;
  float major_value, middle_value, minor_value;
  Eigen::Vector3f major_vector, middle_vector, minor_vector;
  Eigen::Vector3f mass_center;

  feature_extractor.getMomentOfInertia (moment_of_inertia);
  feature_extractor.getEccentricity (eccentricity);
  feature_extractor.getAABB (min_point_AABB, max_point_AABB);
  feature_extractor.getOBB (min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);
  feature_extractor.getEigenValues (major_value, middle_value, minor_value);
  feature_extractor.getEigenVectors (major_vector, middle_vector, minor_vector);
  feature_extractor.getMassCenter (mass_center);

  boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
  viewer->setBackgroundColor (
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值