返回 >>>>>> PCL-3D点云总目录

使用pcl::MomentOfInertiaEstimation类来获取基于偏心率和惯性矩的描述符。该类还允许提取云的轴对齐和定向的边界框。但是提取的OBB并非最小可能的边界框。

代码实现

创建文件:moment_of_inertia.cpp

准备资源:./data/milk_color.pcd

执行命令:./moment_of_inertia ./data/milk_color.pcd

#include <vector>
#include <thread>#include <pcl/features/moment_of_inertia_estimation.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>using namespace std::chrono_literals;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);// 获取AABB盒子feature_extractor.getAABB (min_point_AABB, max_point_AABB);// 获取OBB盒子feature_extractor.getOBB (min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);feature_extractor.getEigenValues (major_value, middle_value, minor_value);// 获取主轴major_vector,中轴middle_vector,辅助轴minor_vectorfeature_extractor.getEigenVectors (major_vector, middle_vector, minor_vector);// 获取质心feature_extractor.getMassCenter (mass_center);pcl::visualization::PCLVisualizer::Ptr 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");// 添加AABB包容盒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");viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, "AABB");// 添加OBB包容盒Eigen::Vector3f position (position_OBB.x, position_OBB.y, position_OBB.z);Eigen::Quaternionf quat (rotational_matrix_OBB);// 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  深度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_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, "OBB");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");while(!viewer->wasStopped()){viewer->spinOnce (100);std::this_thread::sleep_for(100ms);}return (0);
}

实现效果

黄色立方体为AABB包容盒,白色立方体为OBB包容盒

原理简述

包围体(包容盒)是一个简单的几何空间,里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行碰撞检测或者进行精确的碰撞检测之前进行过滤(即当包围体碰撞,才进行精确碰撞检测和处理)。包围体类型包括球体、轴对齐包围盒(AABB)、有向包围盒(OBB)、8-DOP以及凸壳(CONVEX HULL)。

常见包容盒( Bounding Volumes)分类:

包容球:SPHERE 用球体包围整个几何体,用于相交测试很方便,但是其紧密型差,周围空隙较大,当物体变形后,包围球需要重新计算。当对象进行旋转运动时,包围球不需要做任何更新,这是包围球的优势,即当几何对象频繁进行旋转运动时,使用包围球效率较高。
AABB包容盒:Axially Aligned Bounding Box,3D环境下的AABB盒即一个六面体,每个边都平行于一个坐标平面,较简单,但紧密性较差,当物体旋转、形变之后需要对AABB进行更新。本身的长宽高根据物体大小而定。
OBB包容盒:Oriented Bounding Box,此方法紧密型较好,可以降低参与相交测试的包容盒数目,因此性能要优于AABB和包容球。当物体发生旋转,仅需对OBB进行相同的旋转即可,但是当物体形变后,更新OBB的代价较大,故不适用那些软体的对象。

如上图所示,还有K-DOP,CONVEX HULL等包容盒,越靠右,包容效果好、越紧密。但是检测速度更慢,也更消耗内存资源。

注:以上文字和图片均来源于链接,若有侵权请联系转载方删除。

返回 >>>>>> PCL-3D点云总目录

4.3-3D包容盒子相关推荐

  1. css动画-3d旋转盒子

    css动画-3d旋转盒子 效果图: 思路: 1.一个容器,装6个子容器放6张图(我是采用的ul列表) <ul class="container"><li id=& ...

  2. AE制作3D立方体盒子教程

    最近有朋友问我,说立体3D的盒子不知道该怎么做.之前的话我肯定跟他说很复杂的方法,但是VE Simple Box的出现,一分钟就能够用AE制作一个好看的3D立体盒子,今天就来跟大家说说3D立体盒子的A ...

  3. 从零开始学前端:形变(小游戏:3D翻滚盒子) --- 今天你学习了吗?(CSS:Day21)

    从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(CSS) 复习:从零开始学前端:过渡和动画 - 今天你学习了吗?(CSS:Day20) 文章目录 从零开始学前端:程序猿小白也可以完全掌握 ...

  4. java3D实现空间立方体,纯CSS3实现一个旋转的3D立方体盒子

    简单介绍 上网易前端微专业课程,里面有一个课外作业是实现一个3D旋转立方体.花了点时间做了下.还有点意思.写个简单教程.供大家学习. 先放上终于要实现的效果 注:代码在chrome 43.0.2357 ...

  5. 前端css3实现 3D立体盒子动画

    HTML代码 <!--外层立方体--> <div id="parent"><div></div><div></di ...

  6. CSS3绘制3D盒子,动态害羞表情包

    CSS3非常强大,我们不仅可以用它来绘制平面的图形,还可以绘制2D,3D的图形,并且可以制作一些动态的图,解锁CSS新玩法,今天要分享就是立体的3D盒子和动态超萌害羞表情包,先来看看效果 附上完整的代 ...

  7. 利用css3实现3d立体特效--正方体

    其实css3中提供了很多让我们实现非常炫酷的工具,好多特效不需要通过复杂的js代码来实现,而可以通过简单的css3代码来实现,这一次我就给大家介绍一下3d立体盒子的实现以及动画的实现. 要实现这个正当 ...

  8. 【论文笔记】MV3D:Multi-View 3D Object Detection Network for Autonomous Driving

    摘要 本文针对自动驾驶场景中的高精度3D对象检测.我们提出了多视点三维网络(MV3D),这是一个以激光雷达点云和RGB图像为输入,预测定向三维边界框的传感器融合框架.我们用一个紧凑的多视图表示来编码稀 ...

  9. 笔记:A Novel Representation of Parts for Accurate 3D Object Detection and Tracking in Monocular Images

    A Novel Representation of Parts for Accurate 3D Object Detection and Tracking in Monocular Images 20 ...

最新文章

  1. CPU深夜狂飙,一帮大佬都傻眼了...
  2. 留念,第一次在C中调用lua成功!
  3. Phantom.js维护者退出,项目的未来成疑
  4. 网站福音 如何免费获得HTTPS认证服务?
  5. VSCode 6 月 Java 更新,编辑器就该有编辑器的样子
  6. js中substr与substring的差别
  7. 使用 Git 生成 SSH Key 并将项目上传到 GitHub
  8. java上传图片特征码到服务器,记一个Base64编码后经网络传输产生的问题
  9. java 导出表格打包zip文件下载_asyExcel导出excel并打包成zip压缩包下载
  10. 华为MUX VLAN原理和实验
  11. smarty缓存控制
  12. Ruby完全自学手册
  13. 光学:薄透镜成像、景深
  14. ToolB不能用了,这里有完美替代
  15. 动手实现简易端口扫描器——PortScanner
  16. Occupancy Flow: 4D Reconstruction by Learning Particle Dynamics(2)
  17. 蓝牙 - 配对和连接
  18. kafka的isr理解
  19. 双向可控硅触发电路的设计方案
  20. 类脑智能:人造超级大脑

热门文章

  1. 选择分集matlab程序,matlab053 协作分集技术的仿真分析
  2. 选择分集matlab程序,无线通信分集技术matlab仿真.doc
  3. 摩客怎么设置安卓的dp_Android屏幕适配——使用 dp 实现完美适配
  4. 均匀分布 卡方分布_总结 | 深度学习那些需要掌握的概率分布
  5. 【数据结构】带头双向循环链表的增删查改(C语言实现)
  6. C语言scanf函数
  7. 计算机网络实验报告(路由协议配置实验)
  8. TP5与TP6的差异
  9. 刚入职一个月的硬件工程师谈谈感受,分享一下个人的心得体会
  10. SVN操作报错(乱码浠vn cleanup钬)