3D点云平面拟合算法

假设你有一组 3D 中的 n 个点,并且想要为它们拟合一个平面。 在本文中,我将推导出一个简单的、数值稳定的方法,并提供它的源代码。 听起来很好玩? 我们开始吧!

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎

首先,如果在网上寻找答案,你将得到的答案包括对协方差矩阵进行奇异值分解以找到最小特征值的特征向量。 然而事实证明,这让事情变得比他们需要的更加复杂。 让我们从基础开始:

平面通常由法向量 n = [a, b, c]ᵀ 和距离 d 描述,因此对于平面 n · p + d = 0 上的点 p = [x, y, z]ᵀ。我们可以 将其写为:

但请注意,这是超定的 - 解空间(平面)是三维的,但上面的描述使用了四个值。 因此,让我们首先通过限制解决方案空间来删除一个组件。 我们通过任意指定 c = 1 来实现这一点,即平面法线的 z 分量始终为 1(请注意,法线的长度不需要为 1)。 如果你认为这是一个潜在有问题的假设,那么你是对的——我们稍后会再讨论这个问题。 现在,让我们定义:

并求解a、b、d。 矩阵形式:

接下来,我们将这个矩阵转置,然后从左侧相乘以执行线性最小二乘:

转置后相乘:

其中 N 是点数。 现在这是聪明的部分:让我们定义上面的 x,y,z 相对于点云的质心(平均值)。 现在 Σx = Σy = Σz = 0 所以我们可以简化为:

从最后一行(N·d = 0)我们可以得出结论:d = 0。这意味着如果所有点都相对于点云的质心,则平面穿过原点。 换句话说:平面始终穿过输入点的平均值。 我们现在可以去掉一个维度:

克莱默规则告诉我们:

我们可以通过将 n 乘以 D 来简化它(无论如何我们都需要对 n 进行归一化),这给我们:

就是这样! 但请记住我们的假设:平面法线的 z 分量不为零。 如果为零怎么办? 那么可以证明上面的行列式 D 变为零并且我们可以除以零。 即使它不完全为零,但很接近,我们仍然会得到不好的条件,从而得到不好的结果。 所以,我们能做些什么? 好吧,如果这些点跨越一个平面,则法线的至少一个分量必须非零。 因此,让我们对三个单独的假设进行上述计算,其中哪个分量不为零。 然后我们简单地选择表现最好的一个,即具有最大行列式的那个。

注意:此方法将最小化垂直于主轴的残差的平方,而不是垂直于平面的残差的平方。 如果残差很小(即你的点都靠近生成的平面),那么这种方法可能就足够了。 但是,如果你的点分布比较分散,那么此方法可能不是最合适的。

这是 Rust 代码:

// Constructs a plane from a collection of points
// so that the summed squared distance to all points is minimzized
fn plane_from_points(points: &[Vec3]) -> Option<Plane> {if points.len() < 3 {return None; // At least three points required}let mut sum = Vec3{x:0.0, y:0.0, z:0.0};for p in points {sum += p;}let centroid = sum * (1.0 / (points.len() as f64));// Calc full 3x3 covariance matrix, excluding symmetries:let mut xx = 0.0; let mut xy = 0.0; let mut xz = 0.0;let mut yy = 0.0; let mut yz = 0.0; let mut zz = 0.0;for p in points {let r = p - centroid;xx += r.x * r.x;xy += r.x * r.y;xz += r.x * r.z;yy += r.y * r.y;yz += r.y * r.z;zz += r.z * r.z;}let det_x = yy*zz - yz*yz;let det_y = xx*zz - xz*xz;let det_z = xx*yy - xy*xy;let det_max = max3(det_x, det_y, det_z);if det_max <= 0.0 {return None; // The points don't span a plane}// Pick path with best conditioning:let dir =if det_max == det_x {Vec3{x: det_x,y: xz*yz - xy*zz,z: xy*yz - xz*yy,}} else if det_max == det_y {Vec3{x: xz*yz - xy*zz,y: det_y,z: xy*xz - yz*xx,}} else {Vec3{x: xy*yz - xz*yy,y: xy*xz - yz*xx,z: det_z,}};Some(plane_from_point_and_normal(centroid, normalize(dir)))
}

原文链接:3D点云平面拟合 - BimAnt

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

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

相关文章

阿里云服务器“可用区”是什么意思?

阿里云可用区是什么意思&#xff1f;可用区是同一个地域下电力和网络相互独立的区域&#xff0c;可用区是用来搭建高可用高容灾应用架构的&#xff0c;因为可用区之间可以做到故障隔离。阿里云服务器网aliyunfuwuqi.com简单说下可用区什么是可用区及可用区的选择方法&#xff1…

简易计算器的实现(MFC)

文章目录 1.预备知识1.简单计算器的实现2.快捷键1.全局快捷键1.创建2.注销 2.局部快捷键 3.计算机内部浮点数的存储1.浮点数表示格式2.浮点数的计算3.实例 2.实验目的3.实验内容4.代码实现1.界面编写2.准备工作3.数字输入4.特殊数字输入&#xff08;指数与小数&#xff09;1.指…

计算机组成原理 I/O方式

I/O 方式 I/O方式分类: 程序查询方式。由 CPU通过程序不断查询 /O 设备是否已做好准备&#xff0c;从而控制0 设备与主机交换信息程序中断方式。只在 I/0 设备准备就绪并向 CPU发出中断请求时才予以响应。DMA方式。主存和 I/O 设备之间有一条直接数据通路&#xff0c;当主存和…

UDS诊断(ISO14229-1) 3D服务

文章目录 功能简介应用场景请求和响应1、请求2、子功能3、肯定响应4、否定响应 NRC 判断优先级顺序报文示例UDS中常用 NRC 功能简介 3D服务&#xff0c;即 WriteMemoryByAddress&#xff08;按地址写内存&#xff09;服务&#xff0c;允许客户端向服务器的一个或多个连续存储单…

开源游戏引擎:创造无限可能 | 开源专题 No.56

godotengine/godot Stars: 62.6k License: MIT Godot Engine 是一个功能强大的跨平台游戏引擎&#xff0c;可用于创建 2D 和 3D 游戏。它提供了一套全面的常见工具&#xff0c;让用户可以专注于制作游戏而不必重复造轮子。该引擎支持将游戏一键导出到多个平台上&#xff0c;包…

虾皮广告数据分析:如何进行虾皮广告数据分析以优化广告效果

虾皮&#xff08;Shopee&#xff09;作为一家知名的电商平台&#xff0c;广告数据分析是优化广告效果的关键步骤。通过对广告数据进行深入分析&#xff0c;卖家可以了解广告的表现、找出优势和不足&#xff0c;并制定更有效的广告策略。在本文中&#xff0c;我们将介绍如何进行…

Mac 16g约等于Windows多少g?

Mac 16g 内存等于 Windows 320g 内存 何为“黄金内存”&#xff1f; Mac 的内存是用黄金做的&#xff0c;而 Windows 的内存是用铁做的。 黄金的密度是 19.32 g/cm&#xff0c;而铁的密度是 7.874 g/cm。 因此&#xff0c;16g 的黄金体积是 0.082 cm&#xff0c;而 16g 的铁…

Vue3使用Pinia

1.安装 npm i pinia 2.搭建架子文件 2.1main.js import { createApp } from vue // 引入pinia import { createPinia } from piniaimport App from ./App.vue import router from ./router // 创建pinia const app createApp(App) //安装pinia app.use(createPinia())app.use(…

P1262 间谍网络

1、思路 阅读题目&#xff0c;发现有些间谍可以是被前面的点更新&#xff0c;也就是说&#xff0c;在一开始的时候&#xff0c;把能贿赂的人员从小到达排个序&#xff0c;再使用bfs算法&#xff0c;把他们能到达的人员的贿赂价钱设置为0。 有解的情况&#xff1a; 首先如果有…

【leetcode】力扣热门之反转链表【简单难度】

题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 用例 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 输入&#xff1a;head [] 输出&#xff1a;[…

强化学习的数学原理学习笔记 - 时序差分学习(Temporal Difference)

文章目录 概览&#xff1a;RL方法分类时序差分学习&#xff08;Temporal Difference&#xff0c;TD&#xff09;TD for state valuesBasic TD&#x1f7e1;TD vs. MC &#x1f7e6;Sarsa (TD for action values)Basic Sarsa变体1&#xff1a;Expected Sarsa变体2&#xff1a;n-…

教程:Centos6迁移旧虚拟机文件后的网络配置教程,完美解决虚拟机移动后的网络ip变化问题

博主在工作后,想整整之前大学的虚拟机集群,因此特意从之前的旧电脑把虚拟机文件给拷贝了过来,在导入到vm-workstation,顺便能启动虚拟机后,发现之前的静态ip已经跟现在的宿主机网络不一样。想着重新配置,但觉得太麻烦,故想到了修改网卡的mac地址+网卡重配置方法,完美解…

【已解决】如何用c语言位运算输出浮点数数据

本博文源于笔者正在学习的c语言如何利用位运算输出浮点数数据类型&#xff0c;浮点数在其底部也是用二进制来处理&#xff0c;又考虑到他是低位在前高位在后的原理&#xff0c;因此进行了这样的代码编写 问题浮现 想要用c语言的位运算输出浮点数 问题源码 #include<stdi…

etcd储存安装

目录 etcd介绍: etcd工作原理 选举 复制日志 安全性 etcd工作场景 服务发现 etcd基本术语 etcd安装(centos) 设置&#xff1a;etcd后台运行 etcd 是云原生架构中重要的基础组件&#xff0c;由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册…

[大厂实践] 重新发明后端子集

子集算法有助于优化服务间连接利用率&#xff0c;降低资源使用。但随机或轮询子集算法在动态拓扑环境中会造成较高的连接扰动。本文介绍了谷歌在解决连接扰动方面所做的思考和实践&#xff0c;并介绍了当前最新的Rocksteadier子集算法。原文: Reinventing Backend Subsetting a…

面试题:怎么给详情页做性能优化的?

文章目录 一、背景二、接口优化方案总结1.批处理2.异步处理3.空间换时间4.预处理5.池化思想6.串行改并行7.索引8.避免大事务9.优化程序结构10.深分页问题11.SQL优化12.锁粒度避免过粗 三、最后 一、背景 针对老项目&#xff0c;去年做了许多降本增效的事情&#xff0c;其中发现…

03MyBatis完成CRUD

准备工作 ○ 创建module&#xff08;Maven的普通Java模块&#xff09;&#xff1a;mybatis-002-crud ○ pom.xml ■ 打包方式jar ■ 依赖&#xff1a; ● mybatis依赖 ● mysql驱动依赖 ● junit依赖 ● logback依赖 ○ mybatis-config.xml放在类的根路径下 ○ CarMapper.xml放…

Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (二)

这个是继上一篇文章 “Elasticsearch&#xff1a;Serarch tutorial - 使用 Python 进行搜索 &#xff08;一&#xff09;” 的续篇。在今天的文章中&#xff0c;我们接着来完成如何进行分页及过滤。 分页 - pagination 应用程序处理大量结果通常是不切实际的。 因此&#xff0…

【ros笔记】urdf文件

urdf文件属于xml文件&#xff0c;他的标签有&#xff1a; <robot name"robot_name"><!-- 看的见摸的着刚体用link --><link name"base_link"><!-- 可视化部分 --><visual><!-- 几何形状 --><geometry><!-- b…

vue-springboot 音乐推荐系统 带歌词的音乐播放器系统设计与实现 7902c

少数民族音乐网站在流畅性&#xff0c;续航能力&#xff0c;等方方面面都有着很大的优势。这就意味着少数民族音乐网站的设计可以比其他系统更为出色的能力&#xff0c;可以更高效的完成最新的音乐信息、音乐资讯、在线交流等功能。 此系统设计主要采用的是JAVA语言来进行开发&…