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

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

[2.1.1 计算AABB包围盒](#2.1.1 计算AABB包围盒)

[2.1.2 可视化点云与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。

cpp 复制代码
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的可视化,设置背景颜色、点云颜色以及包围盒的透明度与线宽。

cpp 复制代码
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完整代码

cpp 复制代码
#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;
}

三、实现效果

相关推荐
SweetCode5 分钟前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习
程序员Linc18 分钟前
写给新人的深度学习扫盲贴:向量与矩阵
人工智能·深度学习·矩阵·向量
ゞ 正在缓冲99%…18 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
xuanjiong19 分钟前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划
Zhichao_9736 分钟前
【UE5 C++课程系列笔记】33——商业化Json读写
c++·ue5
惊鸿.Jh38 分钟前
【滑动窗口】3254. 长度为 K 的子数组的能量值 I
数据结构·算法·leetcode
明灯L39 分钟前
《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
经验分享·python·算法·链表·经典例题
碳基学AI1 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义免费下载方法
大数据·人工智能·python·gpt·算法·语言模型·集成学习
补三补四1 小时前
机器学习-聚类分析算法
人工智能·深度学习·算法·机器学习
独好紫罗兰1 小时前
洛谷题单3-P5718 【深基4.例2】找最小值-python-流程图重构
开发语言·python·算法