PCL 计算点云OBB包围盒(PCA)

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1 计算协方差矩阵和质心

2.1.2 计算特征值和特征向量

2.1.3 构建包围盒并可视化

2.2完整代码

三、实现效果


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

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


一、概述

        点云包围盒(Bounding Box)是描述三维空间中点云数据外边界的最小矩形盒,用于精确描述物体的大小、位置、方向等信息。在处理3D数据时,计算包围盒可以有效地简化碰撞检测、缩放、旋转等几何操作。通过主成分分析(PCA)技术,可以根据点云的主轴方向构建包围盒,使包围盒的方向与物体的几何形状更加接近,从而提高空间占用效率。

1.1原理

        PCA(主成分分析)通过计算点云的协方差矩阵来提取点云的主方向,协方差矩阵的特征向量表示点云的主方向,而特征值则代表每个主方向上的数据分布。通过对协方差矩阵的特征分解,可以获得点云的主要方向及大小。利用这些信息,可以构建一个旋转包围盒(OBB),并且通过质心和特征向量计算包围盒的大小和方向。

1.2实现步骤

  1. 读取点云数据:加载点云数据,准备进行PCA分析。
  2. 计算协方差矩阵:使用 pcl::compute3DCentroid pcl::computeCovarianceMatrixNormalized 来计算质心和协方差矩阵。
  3. 计算特征值与特征向量:对协方差矩阵进行特征分解,获得特征向量和特征值。
  4. 构建变换矩阵:通过特征向量构建旋转矩阵,将点云变换至原点。
  5. 计算包围盒:在原点上计算包围盒的大小和方向。
  6. 将结果可视化:使用 PCLVisualizer 将原始点云和包围盒一起展示出来。

1.3应用场景

  1. 用于三维物体识别中的物体包围检测。
  2. 机器人路径规划中,避障检测时使用OBB来精确表示物体的空间位置。
  3. 点云分割后的物体配准与对齐。
  4. 各类场景中的物体紧密包围盒计算。

二、代码实现

2.1关键函数

2.1.1 计算协方差矩阵和质心

该函数计算点云的协方差矩阵和质心。

Eigen::Matrix3f computeCovarianceAndCentroid(pcl::PointCloud<PointType>::Ptr cloud, Eigen::Vector4f& pcaCentroid) {pcl::compute3DCentroid(*cloud, pcaCentroid); // 计算质心Eigen::Matrix3f covariance;pcl::computeCovarianceMatrixNormalized(*cloud, pcaCentroid, covariance); // 计算协方差矩阵return covariance;
}

2.1.2 计算特征值和特征向量

该函数分解协方差矩阵,获取特征值和特征向量。

Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> computePCA(Eigen::Matrix3f covariance) {Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> eigen_solver(covariance, Eigen::ComputeEigenvectors);return eigen_solver;
}

2.1.3 构建包围盒并可视化

该函数通过PCA计算的结果,构建OBB,并可视化展示包围盒和点云。

void visualizeOBB(pcl::PointCloud<PointType>::Ptr cloud,pcl::PointCloud<PointType>::Ptr transformedCloud,Eigen::Vector3f whd,Eigen::Vector3f whd1,Eigen::Vector3f bboxT,Eigen::Quaternionf bboxQ,Eigen::Vector3f bboxT1,Eigen::Quaternionf bboxQ1)
{pcl::visualization::PCLVisualizer viewer;viewer.setBackgroundColor(1.0, 1.0, 1.0);viewer.setWindowName("PCA获取点云包围盒");// 原始点云pcl::visualization::PointCloudColorHandlerCustom<PointType> color_handler(cloud, 255, 0, 0);viewer.addPointCloud(cloud, color_handler, "cloud");viewer.addCube(bboxT, bboxQ, whd.x(), whd.y(), whd.z(), "OBB");viewer.setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, "OBB");// 变换后的点云pcl::visualization::PointCloudColorHandlerCustom<PointType> tc_handler(transformedCloud, 0, 255, 0);viewer.addPointCloud(transformedCloud, tc_handler, "transformedCloud");viewer.addCube(bboxT1, bboxQ1, whd1.x(), whd1.y(), whd1.z(), "OBB1");viewer.addCoordinateSystem(1.0);while (!viewer.wasStopped()) {viewer.spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(10000));}
}

2.2完整代码

#include <iostream>
#include <Eigen/Core>
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
#include <pcl/common/common.h>
#include <pcl/common/transforms.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>using namespace std;
typedef pcl::PointXYZ PointType;int main(int argc, char** argv)
{// 1. 读取点云数据pcl::PointCloud<PointType>::Ptr cloud(new pcl::PointCloud<PointType>());pcl::io::loadPCDFile("bunny.pcd", *cloud);// 2. 计算点云质心和协方差矩阵Eigen::Vector4f pcaCentroid;pcl::compute3DCentroid(*cloud, pcaCentroid);Eigen::Matrix3f covariance;pcl::computeCovarianceMatrixNormalized(*cloud, pcaCentroid, covariance);// 3. 协方差矩阵分解求特征值和特征向量Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> eigen_solver(covariance, Eigen::ComputeEigenvectors);Eigen::Matrix3f eigenVectorsPCA = eigen_solver.eigenvectors();Eigen::Vector3f eigenValuesPCA = eigen_solver.eigenvalues();// 4. 校正主方向eigenVectorsPCA.col(2) = eigenVectorsPCA.col(0).cross(eigenVectorsPCA.col(1));// 5. 将输入点云转换至原点Eigen::Matrix4f tm = Eigen::Matrix4f::Identity();tm.block<3, 3>(0, 0) = eigenVectorsPCA.transpose();tm.block<3, 1>(0, 3) = -1.0f * (eigenVectorsPCA.transpose()) * (pcaCentroid.head<3>());pcl::PointCloud<PointType>::Ptr transformedCloud(new pcl::PointCloud<PointType>);pcl::transformPointCloud(*cloud, *transformedCloud, tm);// 6. 计算包围盒PointType min_p1, max_p1;pcl::getMinMax3D(*transformedCloud, min_p1, max_p1);Eigen::Vector3f c1 = 0.5f * (min_p1.getVector3fMap() + max_p1.getVector3fMap());Eigen::Vector3f whd = max_p1.getVector3fMap() - min_p1.getVector3fMap();// 7. 构建四元数和位移向量Eigen::Quaternionf bboxQ(eigenVectorsPCA); // 使用PCA的特征向量构建四元数Eigen::Vector3f bboxT = pcaCentroid.head<3>(); // 使用质心作为位移// 8. 可视化pcl::visualization::PCLVisualizer viewer;viewer.setBackgroundColor(1.0, 1.0, 1.0);viewer.setWindowName("PCA获取点云包围盒");// 输入的初始点云pcl::visualization::PointCloudColorHandlerCustom<PointType> color_handler(cloud, 255, 0, 0);viewer.addPointCloud(cloud, color_handler, "cloud");// 添加OBB包围盒viewer.addCube(bboxT, bboxQ, whd.x(), whd.y(), whd.z(), "OBB");viewer.setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, "OBB");viewer.setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1.0, 0.0, 0.0, "OBB");//viewer.addCoordinateSystem(1.0);while (!viewer.wasStopped()){viewer.spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(10000));}return 0;
}

三、实现效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/443417.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Renesas R7FA8D1BH (Cortex®-M85)的PWM控制小车

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 硬件架构 2.1 硬件框架结构 2.2 小车控制原理 3 软件功能实现 3.1 FSP配置参数 3.2 代码实现 3.3 源代码文件 源代码下载地址&#xff1a; https://www.firebbs.cn/forum.php?modviewthre…

社工字典生成工具 —— CeWL 使用手册

GitHub - digininja/CeWL: CeWL is a Custom Word List GeneratorCeWL is a Custom Word List Generator. Contribute to digininja/CeWL development by creating an account on GitHub.https://github.com/digininja/CeWL/ 0x01&#xff1a;CeWL 简介 CeWL&#xff08;Cust…

MySQL 联合索引底层存储结构及索引查找过程解读

前言 大家好&#xff0c;我是 Lorin &#xff0c;联合索引&#xff08;Composite Index&#xff09;又称复合索引&#xff0c;它包括两个或更多列。与单列索引不同&#xff0c;联合索引可以覆盖多个列&#xff0c;这有助于加速复杂查询和过滤条件的检索。联合索引的列顺序非常…

从零开始学cv-17:图像绘制基本图形

文章目录 前言一、绘制直线与箭头二、绘制矩形三、绘制圆形椭圆形 前言 随着计算机视觉技术的不断发展&#xff0c;OpenCV作为一款强大的开源图像处理库&#xff0c;受到了越来越多开发者的喜爱。本文将带领读者走进OpenCV的世界&#xff0c;从基础入手&#xff0c;详细介绍如…

冷热数据分离

优质博文&#xff1a;IT-BLOG-CN 一、背景 随着机票业务的快速发展&#xff0c;订单量持续增长对业务性能带来影响&#xff0c;需要进行冷热数据分离。目前机票订单模块主要使用Mysql(InnoDB)作为数据库存储&#xff0c;历史订单信息状态修改频率低并占用大量数据库存储空间&…

腾讯IM SDK:TUIKit发送多张图片

一、问题描述 在使用腾讯IM DEMO&#xff08;https://github.com/TencentCloud/chat-uikit-vue.git&#xff09;时发现其只支持发送一张图片&#xff1a; 二、解决方案 // src\TUIKit\components\TUIChat\message-input-toolbar\image-upload\index.vue<inputref"inp…

AcWing 802. 区间和(离散化算法,python)

本篇博客详细讲解一下离散化知识点&#xff0c;通过讲解和详细列题带大家掌握离散化。 题目&#xff1a; 原题链接&#xff1a;https://www.acwing.com/problem/content/description/804/ 假定有一个无限长的数轴&#xff0c;数轴上每个坐标上的数都是 0。 现在&#xff0c;…

记一次pyc逆向

.py文件   源代码文件。   这是开发者编写的 Python 源代码文件&#xff0c;包含了可执行的 Python 代码。 .pyc文件   字节码文件。   Python 源文件&#xff08;.py&#xff09;在执行时会被编译为字节码&#xff0c;并存储在 __pycache__ 目录下&#xff0c;文件名通…

PHP变量(第④篇)

本栏目教学是php零基础到精通&#xff0c;如果你还没有安装php开发工具请查看下方链接&#xff1a; Vscode、小皮面板安装-CSDN博客 今天来讲一讲php中的变量&#xff0c;变量是用于存储信息的"容器"&#xff0c;这些数据可以在程序执行期间被修改&#xff08;即其…

解决Nginx出现“Too many open files”的问题

解决Nginx出现“Too many open files”的问题 在那个不经意的瞬间&#xff0c;我感到一阵莫名的恍惚。同事突然提出要看我的手机&#xff0c;她的目光落在了我那泛黄的手机壳上。出乎意料地&#xff0c;她开始细心地擦拭&#xff0c;从内到外&#xff0c;动作轻柔而专注。那一刻…

Linux——磁盘分区、挂载

Linux 分区 原理介绍 原理图如下 当我们在/home目录下新建一个文件a.txt时&#xff0c;该文件实际上是存放在硬盘B的分区1中的&#xff0c;这就是图里说的&#xff0c;当进入某个目录&#xff0c;可以进入到该目录下挂载的分区里的意思 硬盘说明 应用实例&#xff1a;挂载一个…

【Flask】Flask数据库

【Flask】Flask数据库 1.概述2.使用Flask-SQLAlchemy管理数据库3.定义模型4.关系5.数据库操作创建表插入行修改行删除行查询行 1.概述 大多数的数据库引擎都有对应的 Python 包&#xff0c;包括开源包和商业包。Flask 并不限制你使用何种类型的数据库包&#xff0c;因此可以根…

PhotoMaker部署文档

一、介绍 PhotoMaker&#xff1a;一种高效的、个性化的文本转图像生成方法&#xff0c;能通过堆叠 ID 嵌入自定义逼真的人类照片。相当于把一张人的照片特征提取出来&#xff0c;然后可以生成你想要的不同风格照片&#xff0c;如写真等等。 主要特点&#xff1a; 在几秒钟内…

前端登录页面验证码

首先&#xff0c;在el-form-item里有两个div&#xff0c;各占一半&#xff0c;左边填验证码&#xff0c;右边生成验证码 <el-form-item prop"code"><div style"display: flex " prop"code"><el-input placeholder"请输入验证…

小赢卡贷公益行:乡村振兴与多元公益并进

在金融科技的浪潮中&#xff0c;小赢卡贷不仅以其创新的金融产品和服务赢得了市场的广泛认可&#xff0c;更以其背后的公益之心&#xff0c;积极履行社会责任&#xff0c;传递着温暖与希望。小赢公益基金会&#xff0c;作为小赢卡贷社会责任的延伸&#xff0c;主要聚焦于乡村振…

Hi3061M开发板——系统时钟频率

这里写目录标题 前言MCU时钟介绍PLLCRG_ConfigPLL时钟配置另附完整系统时钟结构图 前言 Hi3061M使用过程中&#xff0c;AD和APT输出&#xff0c;都需要考虑到时钟频率&#xff0c;特别是APT&#xff0c;关系到PWM的输出频率。于是就研究了下相关的时钟。 MCU时钟介绍 MCU共有…

unix中如何申请进程调度的优先级

一、前言 unix系统中&#xff0c;进程的调度是由内核决定的。在一个系统中&#xff0c;进程的优先级越高&#xff0c;表示其在一定时间中占用cpu的时间越久。本文将介绍unix系统如何修改以及获取进程的优先级。 二、nice值 nice值是unix系统中用于表征进程优先级的一个参数。…

ssh -T git@github.com 出现异常

上传代码到github 私有仓库 步骤 1. 生成 SSH Key&#xff08;如果没有&#xff09; 打开终端并运行&#xff1a; bash 复制 ssh-keygen -t ed25519 -C "your_emailexample.com"按提示保存密钥文件和设置密码短语&#xff08;可选&#xff09;。默认位置是 ~/.…

recyclerView(kotlin)

recyclerView的优点 使用viewHolderRecycledViewPool的方式复用资源&#xff0c;提高性能利用LayoutManager&#xff0c;可根据不同需求使用不同的布局&#xff0c;且可以方便使用对应布局提供的方法&#xff0c;如快速定位item等。RecyclerView 提供了一个 ItemAnimator 接口…

计算机毕业设计Django+Vue.js豆瓣图书推荐系统 图书评论情感分析 豆瓣图书可视化大屏 豆瓣图书爬虫 数据分析 图书大数据 大数据毕业设计 机器学习

《DjangoVue.js豆瓣图书推荐系统》开题报告 一、研究背景与意义 1. 研究背景 随着数字化时代的来临&#xff0c;图书资源日益丰富&#xff0c;用户面临着信息过载的问题。如何在海量图书中快速找到符合个人兴趣和需求的书籍成为了亟待解决的问题。传统的图书检索方式往往基于…