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 和向量 b
    A = np.c_[points[:, :2], np.ones(points.shape[0])]
    b = points[:, 2]

    # 求解线性系统 A^T A [a, b, d]^T = A^T b
    x, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)

    # 返回平面参数 (a, b, c, d)
    a, b, d = x
    c = -1.0  # 平面法向量的z分量
    return a, b, c, d

2.2完整代码

import open3d as o3d
import numpy as np
import matplotlib.pyplot as plt

def fit_plane_least_squares(points):
    """
    使用最小二乘法直接求解拟合点云平面。

    参数:
    points (numpy.ndarray): 点云数据,形状为 (N, 3)。

    返回:
    plane (tuple): 平面参数 (a, b, c, d),其中 ax + by + cz + d = 0。
    """
    # 构建矩阵 A 和向量 b
    A = np.c_[points[:, :2], np.ones(points.shape[0])]
    b = points[:, 2]

    # 求解线性系统 A^T A [a, b, d]^T = A^T b
    x, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)

    # 返回平面参数 (a, b, c, d)
    a, b, d = x
    c = -1.0  # 平面法向量的z分量
    return a, b, c, d

def 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-10

    fig1 = 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

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

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

相关文章

【内网穿透】打洞笔记

文章目录 前言原理阐述公网sshfrp转发服务 实现前提第一步:第二步第三步第四步 补充第五步(希望隧道一直开着)sftp传数据(嫌云服务器上的网太慢) 前言 租了一个云服务器,想用vscode的ssh远程连接&#xff…

Java面试八股之简述redis常见的性能问题和解决方案

简述redis常见的性能问题和解决方案 Redis作为一款高性能的键值存储系统,虽然设计用于提供低延迟的读写操作,但在特定场景下仍可能出现性能瓶颈。下面列出了一些常见的Redis性能问题及其解决方案: 常见性能问题 内存使用过高 Redis是内存…

支付宝低代码搭建电商小程序,无需编程,可视化操作

大家好,我是小悟 在数字化浪潮的推动下,为了更快速、高效地搭建电商小程序,支付宝低代码平台凭借其独特优势,为商家提供了便捷的解决方案。 支付宝低代码平台犹如一座精心打造的智慧工坊,让电商小程序的搭建变得轻而易…

生成树(STP)协议

一、生成树的技术背景 1、交换机单线路上链,存在单点故障,上行线路及设备都不具备冗余性,一旦链路或上行设备发生故障,网络将面临断网。 总结:以下网络不够健壮,不具备冗余性。 2、因此引入如下网络拓扑结构: 上述冗余拓扑能够解决单点故障问题,但同时冗拓扑也带来了…

多级表头固定列问题

父级的width,是需要固定的列的width的总和 参考: el-table 多级表头下对应列的固定

国产麒麟、uos在线编辑word文件并控制编辑区域(局部编辑)

windows系统也适用,该插件可同时支持windows和国产系统 在实际项目开发中,以下场景可能会用到Word局部编辑功能: 合同审批公文流转策划设计报告汇签单招投标(标书文件)其他,有模板且需要不同人员协作编辑…

OpenGL笔记十三之Uniform向量数据传输、使用glUniform3f和glUniform3fv

OpenGL笔记十三之Uniform向量数据传输、使用glUniform3f和glUniform3fv —— 2024-07-14 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记十三之Uniform向量数据传输、使用glUniform3f和glUniform3fv1.glUniform3f1.1.运行1.2.vs1.3.fs1.4.shader.…

<数据集>竹子缺陷检测数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:2953张 标注数量(xml文件个数):2953 标注数量(txt文件个数):2953 标注类别数:3 标注类别名称:[Bud, Sprouted_Bud, Damage_Bud] 序号类别名称图片数框数1Bud2288229…

LintcCode 468 · 对称二叉树【简单 二叉树 递归 Java】

题目 题目链接: https://www.lintcode.com/problem/468/description?showListFetrue&page1&problemTypeId2&tagIds371&orderingid&pageSize50 思路 递归 Java代码 /*** Definition of TreeNode:* public class TreeNode {* public int…

推送Prometheus数据到N9E并通过Grafana展示

小编在上篇文章中已经通过安装jenkins并构建自动化测试项目并发送了消息通知,但是这只是群内的通知,如何通过大盘展示呢?经过讨论,暂时选择采用的实现思路:通过jenkins自动化执行结果来推送Prometheus数据到N9E&#x…

opencv学习:图像视频的读取截取部分图像数据颜色通道提取合并颜色通道边界填充数值计算图像融合

一、计算机眼中的图像 1.图像操作 构成像素点的数字在0~255之间 RGB叫做图像的颜色通道 h500,w500 2.灰度图像 3. 彩色图像 4.图像的读取 5.视频的读取 cv2.VideoCapture()--在OpenCV中,可以使用VideoCapture来读取视频文件,或是摄像头数…

专业电脑硬盘修复教程,教你轻松搞定!

电脑硬盘作为电脑存储系统的重要组成部分,其健康状态直接影响到数据的安全和系统的运行速度。硬盘出现问题可能导致数据丢失、系统崩溃,甚至无法启动。及时进行硬盘修复,不仅可以恢复数据,还能延长硬盘的使用寿命。本文将详细介绍…

【经验分享】关于静态分析工具排查 Bug 的方法

文章目录 编译器的静态分析cppcheck安装 cppcheck运行 cppcheck 程序员的日常工作,不是摸鱼扯皮,就是在写 Bug。虽然这是一个梗,但也可以看出,程序员的日常一定绕不开 Bug。而花更少的时间修复软件中的 Bug,且不引入新…

华为USG6000V防火墙安全策略用户认证

目录 一、实验拓扑图 二、要求 三、IP地址规划 四、实验配置 1🤣防火墙FW1web服务配置 2.网络配置 要求1:DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问 要求2:生产区不…

(01)Unity使用在线AI大模型(使用百度千帆服务)

目录 一、概要 二、环境说明 三、申请百度千帆Key 四、使用千帆大模型 四、给大模型套壳 一、概要 在Unity中使用在线大模型分为两篇发布,此篇文档为在Python中使用千帆大模型,整体实现逻辑是:在Python中接入大模型—>发布为可传参的…

NSSCTF中24网安培训day2中web题目【下】

[NISACTF 2022]easyssrf 这道题目考察的是php伪协议的知识点 首先利用file协议进行flag查找 file:///flag.php 接着我们用file协议继续查找fl4g file:///fl4g 接着我们访问此文件,得到php代码如下 这里存在着stristr的函数&#x…

CREC晶振产品分类

CREC晶振大类有石英晶体谐振器、石英晶体振荡器、石英晶体滤波器 其中石英晶体谐振器: KHZ石英谐振器 车规级32.768KHz石英谐振器 专为汽车RTC应用而设计,通过AECQ-200可靠性测试,满足汽车电子的高标准时频需求,为客户提供可靠…

打破平台限制,使智能手机和平板电脑上无缝运行Windows x86/x64架构的软件和游戏的一款安卓应用

大家好,今天给大家分享一款专为Android设备设计的模拟器应用Winlator。其核心功能是能够在基于ARM架构的智能手机和平板电脑上无缝运行Windows x86/x64架构的软件和游戏。 Winlator是一款Android应用程序,它允许用户使用Wine和Box86/Box64在Android设备上…

通过Dockerfile构建镜像

案例一: 使用Dockerfile构建tomcat镜像 cd /opt mkdir tomcat cd tomcat/ 上传tomcat所需的依赖包 使用tar xf 解压三个压缩包vim Dockerfile FROM centos:7 LABEL function"tomcat image" author"tc" createtime"2024-07-16"ADD j…

4. JavaSE ——【移位运算符】

📖 开场白 亲爱的读者,大家好!我是一名正在学习编程的高校生。在这个博客里,我将和大家一起探讨编程技巧、分享实用工具,并交流学习心得。希望通过我的博客,你能学到有用的知识,提高自己的技能&…