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

三、实现效果

相关推荐
cpp_learners11 分钟前
C++ 实现责任链模式(Chain of Responsibility):从一堆 if-else 到可插拔的处理管道
开发语言·c++·责任链模式
郝学胜_神的一滴20 分钟前
C++11 工程级应用 12:编译期类型魔法,干掉重复与臃肿的代码
c++·visual studio
2601_958352901 小时前
还要写 AEC 算法?0 代码 + 6 个引脚,F-18 让通话清晰度提升 300%
人工智能·算法·降噪消回音
happyprince1 小时前
03-regmix-深刻观-哲学与升华
算法
一路向阳~负责的男人1 小时前
运动控制算法收录
算法
czt_java1 小时前
5个核心位运算公式
算法
Doubbbbbbble云2 小时前
区间合并问题的常见算法模式与优化思路4
java·数据结构·算法
David猪大卫2 小时前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
广州山泉婚姻2 小时前
列表初始化:C++11全新初始化体系
c++·人工智能
莫生灬灬2 小时前
灵码 LingBuilder:用中文写代码,确定性生成真实 C++ 工程(开源)
c++·开源·mfc