基于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拟合平面

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

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

相关文章

2023亚太杯数学建模赛题人工精准翻译

大家好,亚太杯今天早上6点已经开赛啦,然后我在这里给大家带来赛题的精准人工翻译,防止大家直接用软件翻译导致某些地方乱码或者翻译不精准,这会导致后续做题过程出现很大偏差。 注意,以下翻译均免费发放word形式的哈&…

使用websocket获取thingsboard设备的实时数据

背景 有一个读者前来咨询,如何实时获取设备的遥测数据。 其实tb是有提供websocket接口来获取设备数据的。而且还支持js跨域调用。下面给大家演示一下。 websocket地址 完整代码 <!DOCTYPE HTML> <html><h

ImportError: cannot import name ‘contextfilter‘ from ‘jinja2‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

redis的主从复制,哨兵模式

1.主从复制 主从复制&#xff1a;主从复制是redis实现高可用的基础&#xff0c;哨兵模式和集群都是在主从复制的基础之上实现高可用 主从复制实现数据的多机备份&#xff0c;以及读写分离&#xff08;主服务器负责写&#xff0c;从服务器只能读&#xff09; 缺陷&#xff1a…

让SOME/IP运转起来——SOME/IP系统设计(下)之数据库开发

上一篇我们介绍了SOME/IP矩阵的设计流程&#xff0c;这一篇重点介绍如何把SOME/IP矩阵顺利的交给下游软件团队进行开发。 车载以太网通信矩阵开发完成后&#xff0c;下一步应该做什么&#xff1f; 当我们完成SOME/IP矩阵开发&#xff0c;下一步需要把开发完成的矩阵换成固定格…

10.docker的网络network-概述

1.docker的网络模式 docker共有四种网路模式&#xff0c;分别是bridge、host、none和container. 1.1 bridge bridge,也称为虚拟网桥。在bridge模式下&#xff0c;为每个容器分配、配置IP等&#xff0c;并将容器连接到一个docker0。使用–network bridge命令指定&#xff0c;…

【每日OJ —— 622. 设计循环队列】

每日OJ —— 622. 设计循环队列 1.题目&#xff1a;622. 设计循环队列2.解法2.1.解法讲解2.1.1.算法讲解2.1.2.代码实现2.1.3.提交通过展示 1.题目&#xff1a;622. 设计循环队列 2.解法 1.本题有很多解法&#xff1a;可以使用数组&#xff0c;单链表&#xff0c;双链表&#x…

控制论与科学方法论

《控制论与科学方法论》&#xff0c;真心推荐。 书籍原文电子版PDF&#xff1a;https://pan.quark.cn/s/aa40d59295df&#xff08;分类在学习目录下&#xff09; 备用链接&#xff1a;https://pan.xunlei.com/s/VNgj2vjW-Hf_543R2K8kbaifA1?pwd2sap# 控制论是一种让系统按照我…

【精选】CSS入门必看知识点大合集

CSS简介 CSS概念 CSS&#xff08;Cascading Style Sheets&#xff09;层叠样式表&#xff0c;又叫级联样式表&#xff0c;简称样式表 CSS文件后缀名为.css CSS用于HTML文档中元素样式的定义 为什么需要CSS 使用css的唯一目的就是让网页具有美观一致的页面 语法 CSS 规则…

每日一题(LeetCode)----链表--分隔链表

每日一题(LeetCode)----链表–分隔链表 1.题目&#xff08;86. 分隔链表&#xff09; 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初…

Vue3使用dataV报错问题解决

DataV官网&#xff1a;https://datav-vue3.jiaminghi.com/guide/ vue2中是没有问题的&#xff0c;这是第一次在vue3中使用发现的报错问题 报错问题 首先安装&#xff1a; pnpm add dataview/datav-vue3 1. 全局注册报错 然后main.ts全局注册 import { createApp } f…

Redis-Day1基础篇(初识Redis, Redis常见命令, Redis的Java客户端)

Redis-Day1基础篇 初识Redis认识NoSQL认识Redis安装Redis启动RedisRedis客户端 Redis命令数据结构介绍通用命令操作命令StringHashListSetSortedSet Redis的Java客户端客户端对比Jedis客户端Jedis快速入门Jedis连接池 SpringDataRedis客户端SpringDataRedis概述SpringDataRedis…

浅谈WPF之各种Template

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

推荐一款适合做智慧旅游的前端模板

目录 前言 一、功能介绍 二、前端技术介绍 三、功能及界面设计介绍 1、数据概览 2、车辆监控 3、地图界面 4、其它功能 四、扩展说明 总结 前言 智慧旅游是一种全新的旅游业务模式&#xff0c;它充分利用先进的信息技术&#xff0c;提升旅游体验&#xff0c;优化旅游管…

【HarmonyOS】元服务卡片本地启动拉起加桌没问题,上架后拉起加桌时卡片展示异常

【关键字】 加桌选卡展示异常 、 2卡共用一个布局 、 代码混淆 【问题现象】 元服务卡片在本地启动拉起加桌时&#xff0c;多卡的选卡过程显示是没问题的。但是在上架后拉起加桌时&#xff0c;多卡的选卡过程卡片展示异常。 代码逻辑是通过创建卡片的时候判断卡片的尺寸大小…

设计模式-16-Spring源码中的设计模式

1-Spring之观察者模式 Java、Google Guava都提供了观察者模式的实现框架。Java提供的框架比较简单&#xff0c;只包含java.util.Observable和java.util.Observer两个类。Google Guava提供的框架功能比较完善和强大&#xff1a;通过EventBus事件总线来实现观察者模式。实际上&am…

对比两个数组中对应位置的两个元素将每次对比的最大值用于构成新的数组np.maximum()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 对比两个数组中对应位置的两个元素 将每次对比的最大值用于构成新的数组 np.maximum() 选择题 以下代码的输出结果为&#xff1f; import numpy as np a1 [1,2,33] a2 [11,2,3] print("…

查看当前laravel版本三种方法(笔记二)

1、在终端中使用 Artisan 命令&#xff1a;在 Laravel 项目的根目录下&#xff0c;打开终端&#xff08;命令行界面&#xff09;&#xff0c;然后运行以下命令&#xff1a; php artisan --version 2、控制器中打印版本 var_dump(app()->version()); 3、在 Laravel 项目的根目…

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

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

MacOS 成为恶意软件活动的目标

Malwarebytes 警告称&#xff0c;一个针对 Mac 操作系统 (OS) 的数据窃取程序正在通过虚假的网络浏览器更新分发给毫无戒心的目标。 Atomic Stealer&#xff0c;也称为 AMOS&#xff0c;是 Mac OS 上流行的窃取程序。 Atomic Stealer (AMOS) 恶意软件最近被发现使用“ClearFa…