1、概述

本例程利用pcl::MomentOfInertiaEstimation类获取基于惯性矩(moment of inertia)与偏心率(eccentricity)的描述子,该类的另一功能是提取有向包围盒OBB(Oriented Bounding Box)和坐标轴对齐包围盒AABB(Axis-Aligned Bounding Box)。但是所提取的有向包围盒常用于物理模型或可视化中用到的碰撞检测等。

2、包围盒提取代码

#include <pcl/features/moment_of_inertia_estimation.h>//惯性矩估计的头文件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);//OBB对应的相关参数feature_extractor.getEigenValues (major_value, middle_value, minor_value);//三个特征值feature_extractor.getEigenVectors (major_vector, middle_vector, minor_vector);//三个特征向量feature_extractor.getMassCenter (mass_center);//计算质心

3、全部代码

#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);//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 ("点云库PCL学习教程第二版-基于惯性矩与偏心率的描述子"));viewer->setBackgroundColor (1, 1, 1);viewer->addCoordinateSystem (1.0);viewer->initCameraParameters ();viewer->addPointCloud<pcl::PointXYZ> (cloud,pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(cloud,0,255,0), "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,5,"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, 0.0, 0.0, "AABB");viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY,0.1,"AABB");//图形的不透明度viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_LINE_WIDTH,4,"AABB");//线宽Eigen::Vector3f position (position_OBB.x, position_OBB.y, position_OBB.z);std::cout<<"position_OBB: "<<position_OBB<<endl;std::cout<<"mass_center: "<<mass_center<<endl;//中心坐标Eigen::Quaternionf quat (rotational_matrix_OBB);viewer->addCube (position, quat, max_point_OBB.x - min_point_OBB.x, max_point_OBB.y - min_point_OBB.y, max_point_OBB.z - min_point_OBB.z, "OBB");viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,0,0,1,"OBB");viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY,0.1,"OBB");viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_LINE_WIDTH,4,"OBB");viewer->setRepresentationToWireframeForAllActors();//将所有actor的可视化表示更改为线框表示pcl::PointXYZ center (mass_center (0), mass_center (1), mass_center (2));pcl::PointXYZ x_axis (major_vector (0) + mass_center (0), major_vector (1) + mass_center (1), major_vector (2) + mass_center (2));pcl::PointXYZ y_axis (middle_vector (0) + mass_center (0), middle_vector (1) + mass_center (1), middle_vector (2) + mass_center (2));pcl::PointXYZ z_axis (minor_vector (0) + mass_center (0), minor_vector (1) + mass_center (1), minor_vector (2) + mass_center (2));viewer->addLine (center, x_axis, 1.0f, 0.0f, 0.0f, "major eigen vector");viewer->addLine (center, y_axis, 0.0f, 1.0f, 0.0f, "middle eigen vector");viewer->addLine (center, z_axis, 0.0f, 0.0f, 1.0f, "minor eigen vector");std::cout<<"size of cloud :"<<cloud->points.size()<<endl;std::cout<<"moment_of_inertia :"<<moment_of_inertia.size()<<endl;std::cout<<"eccentricity :"<<eccentricity.size()<<endl;//Eigen::Vector3f p1 (min_point_OBB.x, min_point_OBB.y, min_point_OBB.z);//Eigen::Vector3f p2 (min_point_OBB.x, min_point_OBB.y, max_point_OBB.z);//Eigen::Vector3f p3 (max_point_OBB.x, min_point_OBB.y, max_point_OBB.z);//Eigen::Vector3f p4 (max_point_OBB.x, min_point_OBB.y, min_point_OBB.z);//Eigen::Vector3f p5 (min_point_OBB.x, max_point_OBB.y, min_point_OBB.z);//Eigen::Vector3f p6 (min_point_OBB.x, max_point_OBB.y, max_point_OBB.z);//Eigen::Vector3f p7 (max_point_OBB.x, max_point_OBB.y, max_point_OBB.z);//Eigen::Vector3f p8 (max_point_OBB.x, max_point_OBB.y, min_point_OBB.z);//p1 = rotational_matrix_OBB * p1 + position;//p2 = rotational_matrix_OBB * p2 + position;//p3 = rotational_matrix_OBB * p3 + position;//p4 = rotational_matrix_OBB * p4 + position;//p5 = rotational_matrix_OBB * p5 + position;//p6 = rotational_matrix_OBB * p6 + position;//p7 = rotational_matrix_OBB * p7 + position;//p8 = rotational_matrix_OBB * p8 + position;//pcl::PointXYZ pt1 (p1 (0), p1 (1), p1 (2));//pcl::PointXYZ pt2 (p2 (0), p2 (1), p2 (2));//pcl::PointXYZ pt3 (p3 (0), p3 (1), p3 (2));//pcl::PointXYZ pt4 (p4 (0), p4 (1), p4 (2));//pcl::PointXYZ pt5 (p5 (0), p5 (1), p5 (2));//pcl::PointXYZ pt6 (p6 (0), p6 (1), p6 (2));//pcl::PointXYZ pt7 (p7 (0), p7 (1), p7 (2));//pcl::PointXYZ pt8 (p8 (0), p8 (1), p8 (2));//viewer->addLine (pt1, pt2, 1.0, 0.0, 0.0, "1 edge");//viewer->addLine (pt1, pt4, 1.0, 0.0, 0.0, "2 edge");//viewer->addLine (pt1, pt5, 1.0, 0.0, 0.0, "3 edge");//viewer->addLine (pt5, pt6, 1.0, 0.0, 0.0, "4 edge");//viewer->addLine (pt5, pt8, 1.0, 0.0, 0.0, "5 edge");//viewer->addLine (pt2, pt6, 1.0, 0.0, 0.0, "6 edge");//viewer->addLine (pt6, pt7, 1.0, 0.0, 0.0, "7 edge");//viewer->addLine (pt7, pt8, 1.0, 0.0, 0.0, "8 edge");//viewer->addLine (pt2, pt3, 1.0, 0.0, 0.0, "9 edge");//viewer->addLine (pt4, pt8, 1.0, 0.0, 0.0, "10 edge");//viewer->addLine (pt3, pt4, 1.0, 0.0, 0.0, "11 edge");//viewer->addLine (pt3, pt7, 1.0, 0.0, 0.0, "12 edge");while(!viewer->wasStopped()){viewer->spinOnce (100);boost::this_thread::sleep (boost::posix_time::microseconds (100000));}return (0);
}

4、可视化

红色为坐标轴对齐包围盒AABB,蓝色为有向包围盒OBB

PCL 基于惯性矩与偏心率的描述子进行包围盒提取相关推荐

  1. PCL——基于惯性矩与偏心率的描述子进行包围盒提取

    基于惯性矩与偏心率的描述子提取包围盒 文章目录 基于惯性矩与偏心率的描述子提取包围盒 1.概述 2.OBB的实现原理 3.代码 4.效果展示 1.概述 pcl::MomentOfInertiaEsti ...

  2. PCL 惯性矩和偏心率

    一.MomentOfInertiaEstimation惯性矩估计 PCL--基于惯性矩与偏心率的描述子进行包围盒提取_emm@aaaM的博客-CSDN博客1 (1)获取基于惯性矩(moment of ...

  3. PCL中3D点云特征描述与提取(三)

    PCL中3D点云特征描述与提取(三) 1 如何从一个深度图像中提取NARF特征 2 RoPs特征 2.1 理论基础 2.1.1 生物视觉认知学启示 2.1.2 局部参考坐标框架构建 2.1.3 RoP ...

  4. A performance evaluation of local descriptors——局部描述子评估译文(1,2,...)

    现有局部描述子的性能评估 Krystian Mikolajczyk                  Cordelia Schmid   计算机科学系               法国国立计算机与自动 ...

  5. A performance evaluation of local descriptors——局部描述子评估译文

    A performance evaluation of local descriptors--局部描述子评估译文(1,2,...) 现有局部描述子的性能评估 Krystian Mikolajczyk  ...

  6. PCL:点云特征描述子3D_object_recognition_(descriptors)

    PCL官网:https://pointclouds.org/ 翻译自该网站:http://robotica.unileon.es/index.php/PCL/OpenNI_tutorial_4:_3D ...

  7. 基于点云描述子的立体视觉里程计快速鲁棒的位置识别方法

    点云PCL免费知识星球,点云论文速读. 文章:A Fast and Robust Place Recognition Approach for Stereo Visual Odometry Using ...

  8. PCL中3D特征描述子Shot详解

    上周点云公众号开始分享群友们的反馈分享,由博主分配任务,半个月甚至一个月参与学习小伙伴的反馈给群主,并在微信交流群中进行学术交流,加强大家的阅读文献能力,并提高公众号的分享效果.已经有一些开始陆续反馈 ...

  9. 基于形状图像检索的曲率尺度空间描述符与傅立叶描述子的比较研究——18.07.14

    论文信息:<A comparative study of curvature scale space and Fourier descriptors for shape-based image ...

最新文章

  1. linux c 崩溃调试方法
  2. 高考与机器学习训练测试
  3. [MySQL 5.6] GTID实现、运维变化及存在的bug
  4. python 倒排索引 性能_python 实现倒排索引的方法
  5. Deep Learning(深度学习)学习笔记整理(二)
  6. php框架之laravel
  7. QT控件出现乱码问题
  8. 学生学籍管理系统课程设计报告书
  9. html中楷书的格式,中国书法的书写格式
  10. excel自动填充脚本(awk)
  11. Chrome插件-图片批量下载
  12. 消费信贷评分建模与应用笔记-2
  13. 原创|对接三方服务商回调鉴权的程序代码设计
  14. win10蓝牙功能不见了_Win10 2004更新了什么?新功能新特性汇总
  15. WinXP SP2 USER32.DLL CallWindowProc(...)
  16. 电脑分盘怎么分?分盘详细教程来了,图文教学
  17. [转载]用户界面设计原则-Jakob Nielson
  18. linux lzma压缩
  19. Java面试题集(136-150)
  20. 计算机的大管家教学反思,第二课 计算机的“大管家”.doc

热门文章

  1. 《计算机科学导论》一导读
  2. C语言中函数指针数组的初始化和使用
  3. 勒索软件即服务(RaaS)团伙年度盘点
  4. HTML blockquote元素
  5. android+xposed+实例,Android Studio 上第一个 Xposed 模块(示例代码)
  6. Python 获取视频fps工具(附代码) | Python工具
  7. 苹果手机屏幕尺寸_iPhone12手机屏幕尺寸影响UI设计
  8. INRIA DataSet数据集label转换为VOC2007数据集形式
  9. 分布式数据库中间件对比总结MyCat Cobar Sharding-jdbc
  10. 软考之路(一):考试题型和考试时间