PCL 计算点云AABB包围盒(惯性矩阵)

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1 计算AABB包围盒

2.1.2 可视化点云与AABB包围盒

2.2完整代码

三、实现效果


PCL点云算法汇总及实战案例汇总的目录地址链接:

PCL点云算法与项目实战案例汇总(长期更新)


一、概述

        基于惯性矩特征计算点云的AABB(Axis-Aligned Bounding Box,轴对齐包围盒)是点云处理中常用的一种包围盒计算方法。通过计算点云的最小外接立方体,可以用于许多应用场景,如碰撞检测、点云裁剪等。

1.1原理

        AABB包围盒是一种最简单的包围盒,它通过计算点云的最小点和最大点的坐标来确定一个轴对齐的矩形盒。在惯性矩计算过程中,包围盒的计算主要依赖于点云的几何分布,使用点云的最小点和最大点作为包围盒的两个对角点。

1.2实现步骤

  1. 读取点云数据:从PCD文件中加载点云。
  2. 基于惯性矩特征计算AABB包围盒:利用PCL的 MomentOfInertiaEstimation 类计算点云的最小和最大点,进而构造AABB包围盒。
  3. 结果可视化:使用PCL可视化工具显示点云以及包围盒,包围盒设置为透明。

1.3应用场景

  1. 点云数据的预处理,尤其是用于裁剪不需要的点云部分。
  2. 机器人路径规划中的障碍物检测与回避。
  3. 工业检测中对物体边界的识别与估计。

二、代码实现

2.1关键函数

2.1.1 计算AABB包围盒

pcl::MomentOfInertiaEstimation 类提供了计算点云的惯性矩特征,并可以获取点云的AABB包围盒。通过调用 getAABB() 函数,可以获取点云的最小和最大点,从而计算AABB。

pcl::MomentOfInertiaEstimation<pcl::PointXYZ> mie;
mie.setInputCloud(cloud);  // 设置输入点云
mie.compute();             // 计算惯性矩
pcl::PointXYZ minPt, maxPt;
mie.getAABB(minPt, maxPt); // 获取AABB包围盒的最小点和最大点

2.1.2 可视化点云与AABB包围盒

使用 pcl::visualization::PCLVisualizer 进行点云和AABB的可视化,设置背景颜色、点云颜色以及包围盒的透明度与线宽。

boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D"));
viewer->setBackgroundColor(1.0, 1.0, 1.0); // 白色背景
viewer->setWindowName(u8"基于惯性偏心距计算点云的AABB包围盒");
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 255, 0, 0); // 红色
viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");
viewer->addCube(minPt.x, maxPt.x, minPt.y, maxPt.y, minPt.z, maxPt.z, 0.0, 1.0, 0.0, "AABB"); // 绿色AABB
viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 0.5, "AABB"); // 透明度
viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_LINE_WIDTH, 3, "AABB"); // 线宽

2.2完整代码

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/features/moment_of_inertia_estimation.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>

int main(int argc, char** argv)
{
    // -----------------------------读取点云-----------------------------------
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("bunny.pcd", *cloud) == -1)
    {
        PCL_ERROR("Could not read file\n");
        return -1;
    }

    // --------------------基于惯性矩特征计算AABB包围盒------------------------
    pcl::MomentOfInertiaEstimation<pcl::PointXYZ> mie;
    mie.setInputCloud(cloud);  // 设置输入点云
    mie.compute();             // 计算惯性矩
    pcl::PointXYZ minPt, maxPt;
    mie.getAABB(minPt, maxPt); // 获取AABB包围盒的最小点和最大点

    // -----------------------------结果可视化---------------------------------
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
    viewer->setBackgroundColor(1.0, 1.0, 1.0); // 设置白色背景
    viewer->setWindowName("AABB");

    // 显示原始点云,颜色为红色
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 255, 0, 0); // 红色点云
    viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");

    // 添加AABB包围盒,设置为绿色,透明度为0.5
    viewer->addCube(minPt.x, maxPt.x, minPt.y, maxPt.y, minPt.z, maxPt.z, 0.0, 1.0, 0.0, "AABB"); // 绿色AABB
   // viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 0.1, "AABB"); // 设置透明度
    viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_LINE_WIDTH, 3, "AABB"); // 设置线宽
    viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, "AABB");
    viewer->addCoordinateSystem(0.1); // 添加坐标轴

    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100); // 刷新显示
        boost::this_thread::sleep(boost::posix_time::microseconds(100000)); // 等待
    }

    return 0;
}

三、实现效果

上一篇:Leetcode—84. 柱状图中最大的矩形【困难】


下一篇:重头开始嵌入式第四十五天(硬件ARM裸机开发 时钟配置 看门狗 )