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

三、实现效果

相关推荐
爱吃生蚝的于勒39 分钟前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
小白学大数据3 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
phoenix@Capricornus3 小时前
循环矩阵和BCCB矩阵与向量乘积的快速计算——矩阵向量乘积与频域乘积之间的转换
线性代数·矩阵
versatile_zpc5 小时前
C++初阶:类和对象(上)
开发语言·c++
小鱼仙官5 小时前
MFC IDC_STATIC控件嵌入一个DIALOG界面
c++·mfc
神仙别闹5 小时前
基本MFC类框架的俄罗斯方块游戏
c++·游戏·mfc
ChoSeitaku6 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
娅娅梨6 小时前
C++ 错题本--not found for architecture x86_64 问题
开发语言·c++
兵哥工控6 小时前
MFC工控项目实例二十九主对话框调用子对话框设定参数值
c++·mfc
Fuxiao___6 小时前
不使用递归的决策树生成算法
算法