当前位置: 首页 > news >正文

Open3D 最小二乘法拟合点云平面

目录

一、概述

1.1最小二乘法原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.2完整代码

三、实现效果

3.1原始点云

3.2matplotlib可视化

3.3平面拟合方程


前期试读,后续会将博客加入该专栏,欢迎订阅

Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客

一、概述

1.1最小二乘法原理

        最小二乘法(Least Squares Method)是一种用于数据拟合的数学优化方法,通过最小化误差平方和来找到最佳拟合参数。在拟合平面时,我们使用最小二乘法来确定平面方程的参数,使得点云数据中的点到该平面的垂直距离的平方和最小。

1.2实现步骤

1.3应用场景

  1. 计算机视觉和图像处理:在物体表面拟合、3D重建和立体视觉中,帮助理解物体的几何形状和结构。
  2. 地理信息系统(GIS)和遥感:在地形建模和分析中,用于生成数字高程模型(DEM)和分析地貌特征。
  3. 机器人学和导航:在路径规划和SLAM中,帮助机器人感知环境并进行定位和导航。
  4. 工程和结构分析:在土木工程和建筑中,用于测量建筑物和结构物的平整度和倾斜度。
  5. 医学图像处理:在医学成像中,用于分析器官和组织的表面特征,辅助诊断和治疗

二、代码实现

2.1关键函数

        在 fit_plane_least_squares 函数中,我们将点云数据的 x 和 y 坐标以及一个常数 1 作为矩阵 A,将 z 坐标作为向量 b。求解线性系统后,我们获得了平面的参数 a, b 和 d。平面方程为 ax + by + cz + d = 0,因此 c = -1

def fit_plane_least_squares(points):"""使用最小二乘法直接求解拟合点云平面。参数:points (numpy.ndarray): 点云数据,形状为 (N, 3)。返回:plane (tuple): 平面参数 (a, b, c, d),其中 ax + by + cz + d = 0。"""# 构建矩阵 A 和向量 bA = np.c_[points[:, :2], np.ones(points.shape[0])]b = points[:, 2]# 求解线性系统 A^T A [a, b, d]^T = A^T bx, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)# 返回平面参数 (a, b, c, d)a, b, d = xc = -1.0  # 平面法向量的z分量return a, b, c, d

2.2完整代码

import open3d as o3d
import numpy as np
import matplotlib.pyplot as pltdef fit_plane_least_squares(points):"""使用最小二乘法直接求解拟合点云平面。参数:points (numpy.ndarray): 点云数据,形状为 (N, 3)。返回:plane (tuple): 平面参数 (a, b, c, d),其中 ax + by + cz + d = 0。"""# 构建矩阵 A 和向量 bA = np.c_[points[:, :2], np.ones(points.shape[0])]b = points[:, 2]# 求解线性系统 A^T A [a, b, d]^T = A^T bx, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)# 返回平面参数 (a, b, c, d)a, b, d = xc = -1.0  # 平面法向量的z分量return a, b, c, ddef plot_fitted_plane(points, plane_params):"""绘制点云和拟合平面的网格。参数:points (numpy.ndarray): 点云数据,形状为 (N, 3)。plane_params (tuple): 平面参数 (a, b, c, d),其中 ax + by + cz + d = 0。"""A, B, C, D = plane_params# 检查 C 值,避免除零错误if np.isclose(C, 0):C = 1e-10fig1 = plt.figure()ax1 = fig1.add_subplot(111, projection='3d')ax1.set_xlabel("x")ax1.set_ylabel("y")ax1.set_zlabel("z")# 获取xyz坐标及最值用于plot绘图min_pt = np.amin(points, axis=0)  # 获取坐标最小值max_pt = np.amax(points, axis=0)  # 获取坐标最大值ax1.scatter(points[:, 0], points[:, 1], points[:, 2], c='r', marker='^')# 创建拟合的平面网格x_p = np.linspace(min_pt[0], max_pt[0], 100)y_p = np.linspace(min_pt[1], max_pt[1], 100)XFit, YFit = np.meshgrid(x_p, y_p)ZFit = -(D + A * XFit + B * YFit) / C# 绘制拟合平面网格ax1.plot_wireframe(XFit, YFit, ZFit, rstride=10, cstride=10)# 显示图像plt.show()# -----------------------------读取点云--------------------------------
pcd = o3d.io.read_point_cloud("tilted_plane_noise.pcd")# 检查并移除 NaN 和无穷大值
pcd = pcd.remove_non_finite_points()# ----------------基于最小二乘法直接求解的拟合平面-----------------------
points = np.asarray(pcd.points)  # 获取点云数据
plane_params = fit_plane_least_squares(points)
A, B, C, D = plane_params
print('平面拟合结果为:%.6f * x + %.6f * y + %.6f * z + %.6f = 0' % (A, B, C, D))# 调用绘制网格平面的函数
plot_fitted_plane(points, plane_params)

三、实现效果

3.1原始点云

3.2matplotlib可视化

3.3平面拟合方程

平面拟合结果为:-0.004528 * x + 0.363171 * y + -1.000000 * z + 0.002728 = 0

相关文章:

Open3D 最小二乘法拟合点云平面

目录 一、概述 1.1最小二乘法原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2matplotlib可视化 3.3平面拟合方程 前期试读,后续会将博客加入该专栏,欢迎订阅 Open3D点云算法与点云深度学习…...

【Django+Vue3 线上教育平台项目实战】登录功能模块之短信登录与钉钉三方登录

文章目录 前言一、几个关键概念1.HTTP无状态性2.Session机制3.Token认证4.JWT 二、通过手机号验证码登录1.前端短信登录界面2.发送短信接口与短信登录接口3.Vue 设置interceptors拦截器4. 服务端验证采用自定义中间件方式实现5. 操作流程及效果图如下: 三、通过第三…...

关于HBase、Phoenix、Flume、Maxwell 和 Flink

组件协同: HBase HBase 是一个分布式的、列存储的NoSQL数据库,它基于Google的Bigtable设计,特别适合存储海量的、稀疏的、非结构化或半结构化数据。HBase 提供了低延迟的随机读写能力,但其原生接口和数据模型较为复杂&#xff0…...

centos7停止维护,可替代的操作系统

CentOS 7 将在 2024 年 6 月 30 日停止维护。如果你目前正在使用 CentOS 7,可以考虑以下几种替代的操作系统: 1. CentOS Stream CentOS Stream 是 CentOS 项目的一个新版本,它提供了一个滚动发布的 Linux 发行版。CentOS Stream 位于 Fedor…...

andon系统在电力设备工管理中起到那些作用与价值

安灯系统,作为精益制造执行中的一个核心工具,在电力设备工厂车间管理中发挥着不可替代的作用,它能够实现生产透明管理,为工厂高效运作提供强大的支撑。本文将从安灯系统的功能、应用场景和价值三个方面,深入探讨其在电…...

消息队列-RabbitMQ

消息队列-RabbitMQ 1、RabbitMQ是什么?2、RabbitMQ的业务场景有哪些?3、RabbitMQ中有哪基本概念?4、RabbitMQ有哪些工作模式?5、如何保证RabbitMQ消息顺序性?6、RabbitMQ消息如何分发?7、RabbitMQ消息怎么路由?8、为什么会产生重复消费?如何保证消息不被重复消费(如何…...

Elasticsearch(ES)集群监控

Elasticsearch(ES)集群监控 在Elasticsearch中,监控集群的健康状况、性能和运行指标是至关重要的。以下是一些常用的Elasticsearch监控工具和API的例子: 使用Elasticsearch自带的API来获取集群健康状态、节点信息和统计信息。 # 获取集群健康状况 curl…...

图像处理:使用 OpenCV-Python 卡通化你的图像(2)

一、说明 在图像处理领域,将图像卡通化是一种新趋势。人们使用不同的应用程序将他们的图像转换为卡通图像。如今,玩弄图像是许多人的爱好。人们通常会点击图片并添加滤镜或使用不同的东西自定义图像并将其发布到社交媒体上。但我们是程序员,…...

淘宝扭蛋机小程序:旋转惊喜,开启购物新篇章!

在追求创新与惊喜的购物时代,淘宝再次引领潮流,精心打造——淘宝扭蛋机小程序,为您的购物之旅增添一抹不同寻常的色彩。这不仅仅是一个购物工具,更是一个充满趣味、互动与惊喜的宝藏盒子,等待您来探索与发现。 【旋转…...

JAVA零基础小白自学日志——第十七天

文章目录 1.方法的覆写2.类的层次结构3.如何判定正确的继承顺序4.如何判断子类继承(继承这个词我始终觉得很变扭)了父类的什么5.继承关系的实质6.关键字:super 和 this[1].this关键字(1)this关键字调用本类属性&#x…...

electron中app.whenReady()和app.on(‘ready‘)的区别

app.whenReady和app.on(‘ready’)都是用于在Electron应用程序中处理初始化完成事件的方法。app.whenReady是一个返回Promise的方法,它会在应用程序准备好创建窗口时解决。一旦app.whenReady被调用,就可以安全地创建窗口,因为此时Electron的初…...

技术速递|Let’s Learn .NET Aspire – 开始您的云原生之旅!

作者:James Montemagno 排版:Alan Wang Let’s Learn .NET 是我们全球性的直播学习活动。在过去 3 年里,来自世界各地的开发人员与团队成员一起学习最新的 .NET 技术,并参加现场研讨会学习如何使用它!最重要的是&#…...

JSONNode树形解析或流式解析

哈喽,大家好,我是木头左! 什么是JSONNode? JSONNode是一个用于处理JSON数据的数据结构,它提供了一种简单、灵活、高效的方式来操作JSON数据。JSONNode可以看作是一个树形结构,其中每个节点都可以包含一个值…...

自制迷宫游戏 c++

竞赛的同时也不能忘记娱乐&#xff0c;劳逸结合&#xff0c;我们自研了迷宫游戏,只能在DEV C 运行哦 #include<bits/stdc.h> #include<iomanip> #include<iostream> #include<cstdlib> #include<ctime> #include<conio.h> #include<win…...

基于复旦微JFMQL100TAI的全国产化FPGA+AI人工智能异构计算平台,兼容XC7Z045-2FFG900I

基于上海复旦微电子FMQL45T900的全国产化ARM核心板。该核心板将复旦微的FMQL45T900&#xff08;与XILINX的XC7Z045-2FFG900I兼容&#xff09;的最小系统集成在了一个87*117mm的核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩展&#xff0c;能够快速的搭建起…...

【数学建模】技术革新——Lingo的使用超详解

目录 基础知识 1. 变量声明 示例 2. 常量声明 语法格式 示例 3. 目标函数 语法格式 示例 4. 约束条件 语法格式 示例 5. 完整的Lingo模型示例 示例 解释 6. 整数变量声明 语法格式 示例 7. 非线性规划 示例 8. 多目标优化 语法格式 示例 9. 数据输入与…...

LLM-阿里 DashVector + langchain self-querying retriever 优化 RAG 实践【Query 优化】

文章目录 前言self querying 简介代码实现总结 前言 现在比较流行的 RAG 检索就是通过大模型 embedding 算法将数据嵌入向量数据库中&#xff0c;然后在将用户的查询向量化&#xff0c;从向量数据库中召回相似性数据&#xff0c;构造成 context template, 放到 LLM 中进行查询…...

【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

DockerCompose介绍,安装,使用

DockerCompose 1、Compose介绍 将单机服务-通过Dockerfile 构建为镜像 -docker run 成为一个服务 user 8080 net 7000 pay 8181 admin 5000 监控 .... docker run 单机版、一个个容器启动和停止问题&#xff1a; 前面我们使用Docker的时候&#xff0c;定义 Dockerfil…...

N叉树的前序遍历

Problem: 589. N 叉树的前序遍历 文章目录 思路解题过程Code 思路 前序遍历&#xff0c;遇到空节点返回 解题过程 对每个节点进行遍历 Code /* // Definition for a Node. class Node { public:int val;vector<Node*> children;Node() {}Node(int _val) {val _val;}Nod…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...