基于PCA算法的点云平面拟合

平面拟合

    • 1、平面拟合
    • 2、参考文献
    • 3、相关代码

在这里插入图片描述

1、平面拟合

  PCA 是一种数学变换的方法,利用降维的思想在变换中保持变量的总方差不变,将给定的一组变量线性变换为另一组不相关的变量,并且使变换后的第一变量的方差最大,即第一主成分,其他分量的方差依次递减。在点云数据中的变量为三维点坐标的集合,其变量为X、Y、Z 三个坐标值,则经过变换后,应有三个主成分,对于一个空间平面,在平行于平面的方向上点集分布最为离散,方差最大,在垂直于平面的方向上,点集分布最为集中,方差最小,即空间平面的第三主成分为垂直于空间平面的向量。由于平面拟合最关键的为法向量的拟合,利用PCA 得到点集的第三主成分,即能进一步拟合出平面方程,如图1 所示。

在这里插入图片描述

图1 PCA变换原理

  对于在坐标系XYZ 下的待拟合平面点云,利用主成分分析法对其进行分析,可得到三个按照从大到小排列的特征值 λ 1 、 λ 2 、 λ 3 λ_1、λ_2、λ_3 λ1λ2λ3,对应的主分量分别为 V 1 、 V 2 、 V 3 V_1、V_2、V_3 V1V2V3,其中 V 1 V_1 V1 V 2 V_2 V2组成了待拟合平面的一组基, V 3 V_3 V3 V 1 V_1 V1 V 2 V_2 V2正交,为垂直于待拟合平面的法向量。如图1,在XYZ 坐标系下的点云,经过主成分分析后,三个主成分分量 V 1 、 V 2 、 V 3 V_1、V_2、V_3 V1V2V3组成了新坐标系 X ′ Y ′ Z ′ X'Y'Z' XYZ的三个基, V 1 V_1 V1 V 2 V_2 V2为平面 X ′ O ′ Z ′ X'O'Z' XOZ的一组基, V 3 V_3 V3 O ′ Z ′ O'Z' OZ方向的基,即所拟合平面的法向量。

PCA 过程如下:
( 1) 特征中心化。即每一维的数据都减去该维的均值,变换之后每一维的均值都变成了零。特征中心化后的点集 P P P,如式( 1) ,其中, x i 、 y i 、 z i x_i、y_i、z_i xiyizi为中心化后点坐标:

P = [ x 1 y 1 z 1 x 2 y 2 z 2 ⋮ ⋮ ⋮ x n y n z n ] (1) P=\left[ \begin{matrix} x_1 & y_1 & z_1\\ x_2 & y_2 & z_2 \\ \vdots & \vdots & \vdots\\ x_n & y_n & z_n \end{matrix} \right] \tag{1} P= x1x2xny1y2ynz1z2zn (1)

(2) 计算三个坐标的协方差矩阵。协方差矩阵 C C C为:
C = [ c o v ( x , x ) c o v ( x , y ) c o v ( x , z ) c o v ( y , x ) c o v ( y , y ) c o v ( y , z ) c o v ( z , x ) c o v ( z , y ) c o v ( z , z ) ] (2) C=\left[ \begin{matrix} cov(x,x) & cov(x,y) & cov(x,z)\\ cov(y,x) & cov(y,y) & cov(y,z) \\ cov(z,x) & cov(z,y) & cov(z,z) \end{matrix} \right] \tag{2} C= cov(x,x)cov(y,x)cov(z,x)cov(x,y)cov(y,y)cov(z,y)cov(x,z)cov(y,z)cov(z,z) (2)

  其中, c o v ( x , y ) cov( x,y) cov(xy) x x x 坐标和 y y y 坐标的协方差, c o v ( x , x ) cov( x,x ) cov(xx) x x x坐标的方差,协方差计算公式如式( 3) , x i 、 y i x_i、y_i xiyi为中心化后点坐标:
c o v ( x , y ) = ∑ i = 1 n x i y i n − 1 (3) cov(x,y)=\frac{\sum_{i=1}^nx_iy_i}{n-1}\tag{3} cov(x,y)=n1i=1nxiyi(3)

  当协方差大于零时说明 x x x y y y是正相关关系,协方差小于零时 x x x y y y是负相关关系,协方差为零时 x x x y y y相互独立。

( 3) 计算协方差矩阵 C C C的特征值和特征向量。所计算出来的特征值按照从大到小排序,分别为 λ 1 、 λ 2 、 λ 3 λ_1、λ_2、λ_3 λ1λ2λ3,其所对应的特征向量分别为 ξ 1 、 ξ 2 、 ξ 3 ξ_1、ξ_2、ξ_3 ξ1ξ2ξ3。显然,两个较大 λ λ λ 所对应的特征向量 ξ 1 、 ξ 2 ξ_1、ξ_2 ξ1ξ2为待拟合平面的一组基,而 ξ 3 ξ_3 ξ3为待拟合平面的法向量,其三个分量分别为 a 、 b 、 c a、b、c abc
  若已知待拟合平面经过点 p ( x 0 , y 0 , z 0 ) p( x_0,y_0,z_0) p(x0y0z0) ,则拟合平面为式( 4) :
a ( x - x 0 ) + b ( y - y 0 ) + c ( z - z 0 ) = 0 (4) a( x-x_0) +b( y-y_0) +c( z-z_0) = 0\tag{4} a(xx0)+b(yy0)+c(zz0)=0(4)

否则,取其均值作为平面上点 p ( x ˉ , y ˉ , z ˉ ) p(\bar{x},\bar{y},\bar{z}) p(xˉ,yˉ,zˉ) 进行拟合。
  采用主成分分析法拟合平面的方法,对于存在噪声点的情况,也能很好的拟合出结果。因为在一个平面点云中,噪声点偏离平面的距离相对于平面的范围较小,对拟合结果的影响可以忽略。

2、参考文献

[1]叶玲洁;颜远青. 基于PCA算法的机载LiDAR点云平面分割算法研究 [J]. 城市勘测, 2018, (01): 41-44+51.

3、相关代码

  • matlab 点云最小二乘拟合平面(PCA法)
  • matlab 点云最小二乘拟合平面(PCA法详细过程版)
  • matlab 最小二乘拟合平面并与XOY平面对齐
  • Open3D 最小二乘拟合平面(PCA法 python详细过程版)
  • Open3D 进阶(12)PCA拟合平面

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

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

相关文章

OpenCV将两张图片拼接成一张图片

OpenCV将两张图片拼接成一张图片 示例代码1示例代码2 可以用opencv或者numpy的拼接函数,直接将两张图拼接到一起,很简单方便,参考代码2,推荐此方式。新建图片,将两张图片的像素值填充到新图片对应位置上即可&#xff0…

leetcode 32最长有效括号 34在排序数组中查找元素的第一个和最后一个位置

32. 最长有效括号 给你一个只包含 ( 和 ) 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 示例 1: 输入:s "(()" 输出:2 解释:最长有效括号子串是 "()" 示例 2&a…

python 二分查找函数应用——bisect_left(nums,target),bisect_right(nums,target)

bisect_left(nums,target),bisect_right(nums,target)是python内置的函数,可以便捷的帮我们完成一些有序序列的查找工作,现在将用三个样例进行讲解演示 前提注意事项: 导入函数模块 待处理序列必须有序!!&#xff0…

浅谈WPF之各种Template

前几天写了一篇文章【浅谈WPF之控件模板和数据模板】,有粉丝反馈说这两种模板容易弄混,不知道什么时候该用控件模块,什么时候该用数据模板,以及template和itemtemplate之间的关系等,今天专门写一篇文章,简述…

26 - 原型模式与享元模式:提升系统性能的利器

原型模式和享元模式,前者是在创建多个实例时,对创建过程的性能进行调优;后者是用减少创建实例的方式,来调优系统性能。这么看,你会不会觉得两个模式有点相互矛盾呢? 其实不然,它们的使用是分场…

TC397 EB MCAL开发从0开始系列 之 [15.1] Fee配置 - 双扇区demo

一、Fee配置1、配置目标2、目标依赖2.1 硬件使用2.2 软件使用2.3 新增模块3、EB配置3.1 配置讲解3.2 模块配置3.2.1 MCU配置3.2.2 PORT配置3.2.3 Fls_17_Dmu配置3.2.4 Fee配置3.2.5 Irq配置3.2.6 ResourceM配置4、ADS代码编写及调试4.1 工程编译4.2 测试结果4.3 测例源码->

2023年学习Go语言是否值得?探索Go语言的魅力

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力! 作为一门流行且不断增长的编程语言,Go语言在2023年是否值得学习呢?让我们来看看学习Go语言的好处以及为何…

Java使用Maven打包jar包的全部方式

1. spring-boot-maven-plugin插件&#xff08;在springboot项目中使用&#xff09; <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals>…

1410.HTML 实体解析器

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;1410. HTML 实体解析器 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 使用map存放特殊字符串及其应被替换为的字符串。然后遍历字符串替换 map 中的字符串即可。 解题代码&#xff1a; …

ubuntu 手动清理内存cache

/proc是一个虚拟文件系统&#xff0c;我们可以通过对它的读写操作来做为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件&#xff0c;来对当前kernel的行为做出调整。 那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。操作如下&#xff1a; …

富士康转移产线和中国手机海外设厂,中国手机出口减少超5亿部

富士康和苹果转移生产线对中国手机制造造成了巨大的影响&#xff0c;除此之外&#xff0c;中国手机企业纷纷在海外设厂也在减少中国手机的出口&#xff0c;2022年中国的手机出口较高峰期减少了5.2亿部。 手机是中国的大宗出口商品&#xff0c;不过公开的数据显示2022年中国的手…

每日OJ题_算法_双指针_力扣202. 快乐数

力扣202. 快乐数 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 难度 简单 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为…

RT-Thread 线程间同步【信号量、互斥量、事件集】

线程间同步 一、信号量1. 创建信号量2. 获取信号量3. 释放信号量4. 删除信号量5. 代码示例 二、互斥量1. 创建互斥量2. 获取互斥量3. 释放互斥量4. 删除互斥量5. 代码示例 三、事件集1. 创建事件集2. 发送事件3. 接收事件4. 删除事件集5. 代码示例 简单来说&#xff0c;同步就是…

PDF转成图片

使用开源库Apache PDFBox将PDF转换为图片 依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.4</version> </dependency> <dependency><groupId>org.apache…

DockerHub 无法访问 - 解决办法

背景 DockerHub 镜像仓库地址 https://hub.docker.com/ 突然就无法访问了,且截至今日(2023/11)还无法访问。 这对我们来说,还是有一些影响的: ● 虽然 DockerHub 页面无法访问,但是还是可以下载镜像的,只是比较慢而已 ● 没法通过界面查询相关镜像,或者维护相关镜像了…

JAVA 使用stream流将List中的对象某一属性创建新的List

JAVA 使用stream流将List中的对象某一属性创建新的List 1.stream流介绍 Java Stream是Java 8引入的一种新机制&#xff0c;它可以让我们以声明式方式操作集合数据&#xff0c;提供了更加简洁、优雅的集合处理方式。Stream是一个来自数据源的元素队列&#xff0c;并支持聚合操…

【Rxjava详解】(二) 操作符的妙用

文章目录 接口变化操作符mapflatmapdebouncethrottleFirst()takeconcat RxJava 是一个基于 观察者模式的异步编程库&#xff0c;它提供了丰富的操作符来处理和转换数据流。 操作符是 RxJava 的核心组成部分&#xff0c;它们提供了一种灵活、可组合的方式来处理数据流&#xf…

C++二分算法:得到子序列的最少操作次数

本文涉及的基础知识点 二分查找算法合集 题目 给你一个数组 target &#xff0c;包含若干 互不相同 的整数&#xff0c;以及另一个整数数组 arr &#xff0c;arr 可能 包含重复元素。 每一次操作中&#xff0c;你可以在 arr 的任意位置插入任一整数。比方说&#xff0c;如果…

【如何学习Python自动化测试】—— 多层窗口定位

6 、 多层窗口定位 多层窗口指的是在操作系统图形界面中&#xff0c;一个窗口被另一个窗口覆盖的情况。在多层窗口中&#xff0c;如何定位需要操作的窗口&#xff1f; 一种常见的方法是使用操作系统提供的AltTab快捷键&#xff0c;可以在打开的所有窗口中快速切换焦点。如果需要…