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;
}

三、实现效果

相关推荐
猿人谷3 小时前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络4 小时前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络4 小时前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao4004 小时前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao4004 小时前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法
兵慌码乱18 小时前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
JieE2122 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2123 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack203 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树3 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色