点云处理中obb算法原理和法向量求解方法

主要数学原理PCA

PCA(Principal Component Analysis,主成分分析)是数据分析中的一种重要技术,通过它可以将高维数据投影到低维空间,找到数据的主要结构。在点云分析中,PCA 可以帮助我们提取点云数据中的主成分方向法向量方向。接下来,我们将详细推导 PCA 的数学原理,特别是如何通过特征值分解来计算主成分方向和法向量方向。

1. 协方差矩阵的计算

假设我们有一个数据矩阵 X,其中每行代表一个样本(数据点),每列代表一个特征(维度)。设 X 是一个 n × m 的矩阵,其中 n 是样本数,m 是特征数。

X = [ x 11 x 12 … x 1 m x 21 x 22 … x 2 m ⋮ ⋮ ⋱ ⋮ x n 1 x n 2 … x n m ] X = \begin{bmatrix} x_{11} & x_{12} & \dots & x_{1m} \\ x_{21} & x_{22} & \dots & x_{2m} \\ \vdots & \vdots & \ddots & \vdots \\ x_{n1} & x_{n2} & \dots & x_{nm} \end{bmatrix} X= x11x21xn1x12x22xn2x1mx2mxnm

为了使得每个特征的均值为 0,我们需要对数据进行去均值化处理。对于每个特征列(每个维度),计算其均值,并从数据中减去该均值:

X ~ = X − X ˉ \tilde{X} = X - \bar{X} X~=XXˉ

其中,( \bar{X} ) 是每列(特征)的均值向量:

X ˉ = 1 n ∑ i = 1 n x i \bar{X} = \frac{1}{n} \sum_{i=1}^{n} x_i Xˉ=n1i=1nxi

然后,协方差矩阵 ( C ) 的计算公式为:

C = 1 n − 1 X ~ T X ~ C = \frac{1}{n-1} \tilde{X}^T \tilde{X} C=n11X~TX~

协方差矩阵 ( C ) 是一个 m × m 的方阵,它衡量了各个特征之间的相关性。矩阵的元素 ( C_{ij} ) 表示第 i 个特征与第 j 个特征之间的协方差。

2. 特征值分解

接下来,我们对协方差矩阵 ( C ) 进行特征值分解,得到其特征值和特征向量。特征值分解的目标是找到一个正交矩阵 ( V ) 和一个对角矩阵 ( \Lambda ),使得:

C V = V Λ C V = V \Lambda CV=VΛ

其中:

  • ( V ) 是特征向量矩阵,每列是一个特征向量 ( v_i ),它们是数据的主成分方向。
  • ( \Lambda ) 是特征值矩阵,对角线上的元素 ( l a m b d a i ) ( lambda_i ) (lambdai) 是每个特征向量对应的特征值,表示数据在该方向上的方差。

特征值分解得到的特征向量 ( v_1, v_2, \dots, v_m ) 表示数据方差最大的方向,特征值 ( \lambda_1, \lambda_2, \dots, \lambda_m ) 则表示在这些方向上的方差大小。

3. 排序特征值和特征向量

特征值 λ 1 , λ 2 , … , λ m \lambda_1, \lambda_2, \dots, \lambda_m λ1,λ2,,λm 按照从大到小的顺序排序。对应的特征向量 v 1 , v 2 , … , v m v_1, v_2, \dots, v_m v1,v2,,vm 也根据特征值的大小进行排序:

λ 1 ≥ λ 2 ≥ ⋯ ≥ λ m \lambda_1 \geq \lambda_2 \geq \dots \geq \lambda_m λ1λ2λm

  • 主成分方向:对应于最大的特征值 λ 1 \lambda_1 λ1的特征向量 v_1 表示数据的主要变化方向(即主成分方向)。
  • 法向量方向:对应于最小的特征值 λ m \lambda_m λm 的特征向量 v m v_m vm 表示数据变化最小的方向,通常对应于点云的法线方向。
4. 主成分方向和法向量方向
  • 主成分方向:数据方差最大的方向。它对应于协方差矩阵 ( C ) 中特征值最大的特征向量。这个方向通常表示数据的主轴,或者说是数据中方差最大的那条方向。数学上,它就是特征值分解中对应最大特征值的特征向量:

v 1 = argmax ( λ 1 ) v_1 = \text{argmax}(\lambda_1) v1=argmax(λ1)

  • 法向量方向:数据方差最小的方向。它对应于协方差矩阵 ( C ) 中特征值最小的特征向量,即 ( v_m ),通常表示数据的法线方向。法向量方向是数据变化最小的方向,通常与点云表面的法线方向对齐:

v m = argmin ( λ m ) v_m = \text{argmin}(\lambda_m) vm=argmin(λm)
pca主成分方向图

5. 数据投影

一旦我们找到了主成分方向和法向量方向,我们可以通过将原始数据投影到这些方向来实现数据的降维。假设我们得到的特征向量矩阵为 V = [ v 1 , v 2 , … , v m ] V = [v_1, v_2, \dots, v_m] V=[v1,v2,,vm],那么我们可以将原始数据投影到新的坐标系中,得到新的数据表示:

Y = X V Y = X V Y=XV
其中:

  • ( Y ) 是投影后的数据矩阵,表示原始数据在新坐标系下的表示。
  • ( V ) 是特征向量矩阵,其中每列是一个特征向量(即主成分方向)。

在投影后的数据 ( Y ) 中,第一列对应主成分方向,第二列对应次主成分方向,依此类推。我们可以选择前 ( k ) 个主成分来实现数据的降维。

点云数据中的应用:主成分方向与法向量

在点云数据处理中,主成分方向通常是点云的主轴,而法向量方向通常与点云表面或物体表面的法线方向对齐。通过计算协方差矩阵的特征值和特征向量,我们可以提取出这些关键的几何特征。

  • 主成分方向:反映了点云数据的主要分布方向,通常用于描述物体的长轴
  • 法向量方向:反映了数据在某个平面上的分布,它通常用于表示点云表面的法线方向

代码

1. 计算 OBB 包围框

OBB 是一个定向包围盒,可以紧密包围点云数据,并且它的方向与数据的主成分方向对齐。在 PCA 中,我们通过特征值分解得到的特征向量,可以用来构建 OBB 包围框。

代码示例:计算 OBB 包围框
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/features/moment_of_inertia_estimation.h>

int main() {
    // 创建点云指针并加载点云数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("path_to_your_point_cloud.pcd", *cloud) == -1) {
        PCL_ERROR("Couldn't read file point_cloud.pcd\n");
        return -1;
    }

    // 计算点云的惯性矩估计
    pcl::MomentOfInertiaEstimation<pcl::PointXYZ> feature_extractor;
    feature_extractor.setInputCloud(cloud);

    // 执行惯性矩估计
    feature_extractor.compute();

    // 获取点云的 OBB 包围盒
    pcl::PointXYZ min_point, max_point;
    Eigen::Matrix3f rotation_matrix;
    feature_extractor.getOBB(min_point, max_point, rotation_matrix);

    // 输出 OBB 的信息
    std::cout << "OBB Min Point: (" << min_point.x << ", " << min_point.y << ", " << min_point.z << ")\n";
    std::cout << "OBB Max Point: (" << max_point.x << ", " << max_point.y << ", " << max_point.z << ")\n";
    std::cout << "Rotation Matrix (主成分方向): \n" << rotation_matrix << std::endl;

    return 0;
}

解释:

  1. 惯性矩估计pcl::MomentOfInertiaEstimation 类计算点云的惯性矩,用来估计点云的包围盒。这个类会利用 PCA 来计算点云的主成分方向。
  2. getOBB():该方法返回点云的 OBB 包围盒,包括包围盒的最小点 (min_point)、最大点 (max_point),以及包围盒的旋转矩阵 (rotation_matrix),旋转矩阵反映了点云的主成分方向。

2. 计算法向量

法向量通常是点云表面上某一点的方向,PCA 可以用来估计这些法向量。在每个点周围的邻域中计算主成分,PCA 的法向量方向是方差最小的方向。

代码示例:计算法向量
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/features/normal_3d.h>

int main() {
    // 创建点云指针并加载点云数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("path_to_your_point_cloud.pcd", *cloud) == -1) {
        PCL_ERROR("Couldn't read file point_cloud.pcd\n");
        return -1;
    }

    // 创建法向量估计对象
    pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
    ne.setInputCloud(cloud);

    // 使用搜索方法(例如 KdTree)来查找点云的邻域
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
    ne.setSearchMethod(tree);

    // 估算法向量
    pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>());
    ne.compute(*normals);

    // 输出法向量信息
    for (size_t i = 0; i < normals->points.size(); ++i) {
        std::cout << "Point " << i << ": Normal (" << normals->points[i].normal_x << ", " 
                  << normals->points[i].normal_y << ", " << normals->points[i].normal_z << ")\n";
    }

    return 0;
}

解释:

  1. 法向量估计pcl::NormalEstimation 类用于估计点云中的法向量。在每个点的邻域内,算法计算其主成分方向,并且法向量对应的是方差最小的特征向量。
  2. setSearchMethod:这里我们使用了 KdTree 方法来查找每个点的邻域,KdTree 是一种常用的空间查找结构,可以有效地查找点云中的邻居点。
  3. 法向量输出:输出每个点的法向量,即点云中每个点的主成分方向之一。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四:工具、环境准备-compute node

一&#xff1a;工具、环境准备-controller node 二&#xff1a;OpenStack环境准备-controller node 三&#xff1a;安装服务-controller node 四&#xff1a;工具、环境准备-compute node 五&#xff1a;OpenStack环境准备-compute node 六&#xff1a;安装服务-compute node 七…

力扣1382:将二叉搜索树便平衡

给你一棵二叉搜索树&#xff0c;请你返回一棵 平衡后 的二叉搜索树&#xff0c;新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法&#xff0c;请你返回任意一种。 如果一棵二叉搜索树中&#xff0c;每个节点的两棵子树高度差不超过 1 &#xff0c;我们就称这棵二…

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测&#xff0c;含优化前后对比 目录 NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测&#xff0c;含优化前后对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介…

微信小程序Webview与H5通信

背景 近期有个微信小程序需要用到web-view嵌套H5的场景&#xff0c;该应用场景需要小程序中频繁传递数据到H5进行渲染&#xff0c;且需要保证页面不刷新。 由于微信小程序与H5之间的通信限制比较大&#xff0c;显然无法满足于我的业务场景 探索 由于微信小程序与webview的环境是…

18. C++STL 4(vector的使用, 空间增长, 迭代器失效详解)

⭐本篇重点&#xff1a;vector容器的使用详解 ⭐本篇代码&#xff1a;c学习/08.vector_test 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. vector的介绍 二. vector的使用 2.1 vector的定义 * 2.2 vector的迭代器和遍历 a operator[]访问 b vect…

NAT拓展

NAT ALG&#xff08;NAT应用级网&#xff09; 为某些应用层协议&#xff0c;因为其报文内容可能携带IP相关信息&#xff0c;而普通NAT转化无法将这些IP转化&#xff0c;从而导致协议无法正常运行 例如FTP&#xff0c;DHCP&#xff0c;RSTP&#xff0c;ICMP&#xff0c;IPSEC…

私有库gitea安装

一 gitea是什么 Gitea是一款自助Git服务&#xff0c;简单来说&#xff0c;就是可以一个私有的github。 搭建很容易。 Gitea依赖于Git。 类似Gitea的还有GitHub、Gitee、GitLab等。 以下是安装步骤。 二 安装sqilite 参考&#xff1a; 在windows上安装sqlite 三 安装git…

从零开始理解JVM:对象的生命周期之对象销毁(垃圾回收)

一、JVM参数 在学垃圾回收器之前&#xff0c;我们先要知道&#xff0c;jvm参数是怎么回事。因为配置各种回收器&#xff0c;必须对应各种参数设置。 标准参数&#xff08;-&#xff09; 所有的JVM实现都必须实现这些参数的功能&#xff0c;而且向后兼容 -help-version 非标准参…

C# 数据类型详解:掌握数据类型及操作为高效编码奠定基础

本文将带你深入了解C#中各种数据类型的特点、用途和最佳实践&#xff0c;让你不仅能熟练运用基本类型&#xff0c;还能掌握如何在实际项目中做出最合适的选择。 目录 C#基本语法 C#数据类型 C#类型转换 C#变量常量 C#基本语法 在学习C#之前我们要先知道C#的基础构建是由哪些…

后端-mybatis的多对多

首先准备两张表学生表和课程表&#xff0c;一个学生可以选多个课程&#xff0c;一门课程也可以被多个学生选择。 再建一个学生表和课程表的中间表&#xff0c;包含学生id和课程id。 我们拿查询所有学生 和他们所选的课程为例&#xff0c;写多对多&#xff08;其实就是一对多&a…

05《存储器层次结构与接口》计算机组成与体系结构 系列课

目录 存储器层次结构概述 层次结构的定义 存储器的排名 存储器接口 处理器与存储器的速度匹配 存储器接口的定义 存储器访问命中率 两种接口 第1种方式&#xff1a;并行 命中率的计算 存储器访问时间 第2种方式&#xff1a;逐级 结语 大家好&#xff0c;欢迎回来。…

软件测试——性能测试工具JMeter

1.JMeter介绍 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。JMeter小巧轻便且免费&#xff0c;逐渐成为了主流的性能测试工具&#xff0c;是每个测试人员都必须要掌握的工具之一。 环境要求&#xff1a; ​ 需要Java8或者更高的版本。 1.1 JMeter的下…

ARP表、MAC表、路由表的区别和各自作用

文章目录 ARP表、MAC表、路由表的区别和各自作用同一网络内:ARP表request - 请求reply - 响应 MAC地址在同一网络内,交换机如何工作? 不同网络路由表不同网络通信流程PC1到路由器路由器到PC2 简短总结 ARP表、MAC表、路由表的区别和各自作用 同一网络内: ARP作用: 让发送方知…

【Azure Cache for Redis】Redis的导出页面无法配置Storage SAS时通过az cli来完成

问题描述 在Azure Redis的导出页面&#xff0c;突然不能配置Storage Account的SAS作为授权方式。 image.png 那么是否可以通过AZ CLI或者是Powershell来实现SAS的配置呢&#xff1f; 问题解答 可以的。使用 az redis export 可以实现 az redis export --container --prefix[--a…

【AI系统】昇腾 AI 架构介绍

昇腾 AI 架构介绍 昇腾计算的基础软硬件是产业的核⼼&#xff0c;也是 AI 计算能⼒的来源。华为&#xff0c;作为昇腾计算产业⽣态的⼀员&#xff0c;是基础软硬件系统的核⼼贡献者。昇腾计算软硬件包括硬件系统、基础软件和应⽤使能等。 而本书介绍的 AI 系统整体架构&#…

transformers microsoft--table-transformer 表格识别

一、安装包 pip install transformers pip install torch pip install SentencePiecepip install timm pip install accelerate pip install pytesseract pillow pandas pip install tesseract 下载模型&#xff1a; https://huggingface.co/microsoft/table-transformer-s…

给UE5优化一丢丢编辑器性能

背后的原理 先看FActorIterator的定义 /*** Actor iterator* Note that when Playing In Editor, this will find actors only in CurrentWorld*/ class FActorIterator : public TActorIteratorBase<FActorIterator> {//..... }找到基类TActorIteratorBase /*** Temp…

Q3营收同比增22.4%,即时配送高质量增长的美团未来何在?

首先&#xff0c;美团核心本地商业的稳健发展为其未来奠定了坚实的基础。核心本地商业营收达694亿元&#xff0c;同比增长20.2%&#xff0c;这显示出美团在本地生活服务领域的强大竞争力。随着中国经济的高质量发展和消费信心的提升&#xff0c;美团的年交易用户数、年活跃商户…

基于R语言森林生态系统结构、功能与稳定性分析与可视化

在生态学研究中&#xff0c;森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性&#xff0c;还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…

2024 ccpc 辽宁省赛 E(构造 思维?)L(二分+一点点数论知识?)

E 题意&#xff1a; 可以注意到&#xff1a; 我的两种方格都四个方格的大小。 所以 如果存在一种摆放方式 那么 4|nm。 再考虑一种特殊的情况 22 &#xff0c;此时虽然我的积是4 但是无法摆放的。 1>对于 4 | n,或者 4 | m.我直接摆放第二种方格就可以了。 如果我n 是4 的…