目录
一、概述
1.1原理
1.2实现步骤
1.3应用场景
二、代码实现
2.1关键函数
2.1.1 计算AABB
2.1.2 可视化AABB
2.2完整代码
三、实现效果
PCL点云算法汇总及实战案例汇总的目录地址链接:
PCL点云算法与项目实战案例汇总(长期更新)
一、概述
点云的包围盒(Bounding Box)是用于描述点云在三维空间中的边界范围的一种简单几何体。在三维点云处理中,包围盒可以用于碰撞检测、快速计算点云边界等应用。AABB(Axis-Aligned Bounding Box)是一种轴对齐的包围盒,始终与坐标轴对齐,因此计算起来较为简单高效。
1.1原理
AABB 包围盒是指与坐标轴对齐的最小矩形框,它是通过获取点云中每个坐标轴的最小值和最大值来确定的。具体计算方式如下:
- 对于给定的点云,计算 x、y、z 三个方向的最小值和最大值。
- 包围盒的六个面分别由这些最大和最小值决定,从而包裹整个点云。
AABB 的计算公式为:
- 最小点(min_x, min_y, min_z)和最大点(max_x, max_y, max_z)分别为点云中 x、y、z 方向的最小和最大坐标值。
1.2实现步骤
- 读取点云数据。
- 使用 PCL 的 getMinMax3D 函数来计算点云的 AABB。
- 可视化原始点云和 AABB 。
1.3应用场景
- 碰撞检测: AABB 可以用于简化复杂几何形状的碰撞检测。
- 物体定位与分割: 利用 AABB 来快速确定物体的边界范围,便于进一步的处理。
- 加速渲染: 在渲染中可以使用 AABB 来快速剔除不可见的对象。
二、代码实现
2.1关键函数
2.1.1 计算AABB
PCL 提供了 getMinMax3D 函数,用于计算点云的最小点和最大点,这些点构成了 AABB。
pcl::getMinMax3D(*cloud, min_point, max_point);
2.1.2 可视化AABB
通过 PCL 可视化库的 addCube 函数可以在视图中添加 AABB 立方体。
viewer->addCube(min_point.x, max_point.x, min_point.y, max_point.y, min_point.z, max_point.z, 1.0, 0.0, 0.0, "AABB");
viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_LINE_WIDTH, 2, "AABB");
2.2完整代码
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/common.h>
#include <pcl/visualization/pcl_visualizer.h>// 计算点云的 AABB 并可视化
void computeAndVisualizeAABB(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud)
{// --------------------- 计算 AABB ---------------------pcl::PointXYZ min_point, max_point;pcl::getMinMax3D(*cloud, min_point, max_point);// --------------------- 创建可视化器 ---------------------pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("AABB Viewer"));// 设置第一个视口,显示原始点云int vp_1, vp_2;viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_1);viewer->addText("Original Point Cloud", 10, 10, "vp1_text", vp_1);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color_handler(cloud, 255, 0, 0); // 红色viewer->addPointCloud(cloud, cloud_color_handler, "original_cloud", vp_1);// 在第一个视口中添加 AABB,并设置透明度//viewer->addCube(min_point.x, max_point.x, min_point.y, max_point.y, min_point.z, max_point.z, 1.0, 0.0, 0.0, "AABB", vp_1);//viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_LINE_WIDTH, 2, "AABB");//viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 0.1, "AABB"); // 设置立方体的透明度为 50%// 设置第二个视口,显示带有 AABB 的点云viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);viewer->setBackgroundColor(0.98, 0.98, 0.98, vp_2);viewer->addText("Point Cloud with AABB", 10, 10, "vp2_text", vp_2);viewer->addPointCloud(cloud, cloud_color_handler, "cloud_with_AABB", vp_2);viewer->addCube(min_point.x, max_point.x, min_point.y, max_point.y, min_point.z, max_point.z, 0.0, 1.0, 0.0, "AABB_2", vp_2); // 绿色立方体viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_LINE_WIDTH, 2, "AABB_2");viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 0.1, "AABB_2"); // 设置立方体的透明度为 50%// 添加坐标系viewer->addCoordinateSystem(1.0);while (!viewer->wasStopped()){viewer->spinOnce(100);}
}int main(int argc, char** argv)
{// -----------------------------读取点云数据---------------------------------pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);if (pcl::io::loadPCDFile<pcl::PointXYZ>("person2.pcd", *cloud) < 0){PCL_ERROR("点云文件不存在");return -1;}// -----------------------------计算并可视化 AABB----------------------------computeAndVisualizeAABB(cloud);return 0;
}