Open3D 非线性最小二乘法拟合空间球

news2024/9/24 17:09:22

目录

一、概述

1.1原理

1.2实现步骤

二、代码实现

2.1关键代码

2.1.1定义残差函数

2.1.2拟合球面

2.2完整代码

三、实现效果

3.1原始点云

3.2拟合后点云

3.3结果数据


前期试读,后续会将博客加入下列链接的专栏,欢迎订阅

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

一、概述

        非线性最小二乘法是拟合复杂曲线和曲面(如球)的常用方法。拟合三维空间中的球面可以通过非线性最小二乘法来实现,使用如 Levenberg-Marquardt 算法进行优化。

1.1原理

1.2实现步骤

1.生成或读取点云数据:
        使用 Open3D 生成或读取三维空间中的点云数据。
2.定义目标函数:
        定义用于非线性最小二乘法优化的目标函数。
3.初始参数估计:
        选择初始的球心和半径估计值。
4.优化求解:
        使用 scipy.optimize.least_squares 或其他优化算法进行非线性最小二乘法优化,拟合球面。
5.可视化结果:
        使用 Open3D 可视化原始点云数据和拟合的球面。

二、代码实现

2.1关键代码

2.1.1定义残差函数

        使用 residuals 函数计算球面拟合的残差。残差是每个点到球面的距离减去球的半径。

def residuals(params, points):
    """
    计算残差,用于非线性最小二乘法优化。

    参数:
    params (numpy.ndarray): 球的参数 (a, b, c, r)。
    points (numpy.ndarray): 点云数据,形状为 (N, 3)。

    返回:
    numpy.ndarray: 残差,形状为 (N,)。
    """
    a, b, c, r = params
    residuals = np.sqrt((points[:, 0] - a)**2 + (points[:, 1] - b)**2 + (points[:, 2] - c)**2) - r
    return residuals

2.1.2拟合球面

        使用 fit_sphere_least_squares 函数进行非线性最小二乘法优化,拟合球面。初始参数估计使用点云数据的均值和平均距离。

def fit_sphere_least_squares(points):
    """
    使用非线性最小二乘法拟合球面。

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

    返回:
    tuple: 拟合的球的参数 (a, b, c, r)。
    """
    # 初始参数估计
    center_estimate = np.mean(points, axis=0)
    radius_estimate = np.mean(np.sqrt(np.sum((points - center_estimate)**2, axis=1)))
    initial_params = np.hstack((center_estimate, radius_estimate))

    # 非线性最小二乘法优化
    result = least_squares(residuals, initial_params, args=(points,))
    return result.x

2.2完整代码


import open3d as o3d
import numpy as np
from scipy.optimize import least_squares

def generate_noisy_sphere(center, radius, num_points=1000, noise_level=0.05):
    """
    生成带有噪声的球面点云数据。

    参数:
    center (tuple): 球心的坐标 (a, b, c)。
    radius (float): 球的半径。
    num_points (int): 点的数量。
    noise_level (float): 噪声水平。

    返回:
    numpy.ndarray: 生成的点云数据。
    """
    phi = np.random.uniform(0, np.pi, num_points)
    theta = np.random.uniform(0, 2 * np.pi, num_points)
    x = center[0] + radius * np.sin(phi) * np.cos(theta)
    y = center[1] + radius * np.sin(phi) * np.sin(theta)
    z = center[2] + radius * np.cos(phi)
    points = np.vstack((x, y, z)).T

    noise = np.random.normal(0, noise_level, points.shape)
    noisy_points = points + noise

    return noisy_points

def residuals(params, points):
    """
    计算残差,用于非线性最小二乘法优化。

    参数:
    params (numpy.ndarray): 球的参数 (a, b, c, r)。
    points (numpy.ndarray): 点云数据,形状为 (N, 3)。

    返回:
    numpy.ndarray: 残差,形状为 (N,)。
    """
    a, b, c, r = params
    residuals = np.sqrt((points[:, 0] - a)**2 + (points[:, 1] - b)**2 + (points[:, 2] - c)**2) - r
    return residuals

def fit_sphere_least_squares(points):
    """
    使用非线性最小二乘法拟合球面。

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

    返回:
    tuple: 拟合的球的参数 (a, b, c, r)。
    """
    # 初始参数估计
    center_estimate = np.mean(points, axis=0)
    radius_estimate = np.mean(np.sqrt(np.sum((points - center_estimate)**2, axis=1)))
    initial_params = np.hstack((center_estimate, radius_estimate))

    # 非线性最小二乘法优化
    result = least_squares(residuals, initial_params, args=(points,))
    return result.x

def create_sphere_mesh(center, radius, resolution=20):
    """
    创建一个球面的 Mesh,用于可视化。

    参数:
    center (tuple): 球心的坐标 (a, b, c)。
    radius (float): 球的半径。
    resolution (int): 球的分辨率。

    返回:
    open3d.geometry.TriangleMesh: 球面 Mesh 对象。
    """
    mesh = o3d.geometry.TriangleMesh.create_sphere(radius=radius, resolution=resolution)
    mesh.translate(center)
    mesh.compute_vertex_normals()
    return mesh

# 生成带有噪声的球面点云数据
center = (0.0, 0.0, 0.0)
radius = 1.0
num_points = 1000
noise_level = 0.05
points = generate_noisy_sphere(center, radius, num_points, noise_level)

# 使用非线性最小二乘法拟合球面
fitted_params = fit_sphere_least_squares(points)
fitted_center = fitted_params[:3]
fitted_radius = fitted_params[3]
print(f"拟合的球心: {fitted_center},拟合的半径: {fitted_radius}")

# 创建点云对象
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
o3d.visualization.draw_geometries([pcd], window_name="pcd",
                                  width=800, height=600, left=50, top=50)

# 创建拟合的球面的 Mesh 对象
sphere_mesh = create_sphere_mesh(fitted_center, fitted_radius)

# 可视化点云和拟合的球面
o3d.visualization.draw_geometries([pcd, sphere_mesh], window_name="Nonlinear Least Squares Sphere Fitting",
                                  width=800, height=600, left=50, top=50)

三、实现效果

3.1原始点云

3.2拟合后点云

3.3结果数据

拟合的球心: [-0.00122239 -0.00153872 -0.00223764],拟合的半径: 1.0035838562569899

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

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

相关文章

题解|2023暑期杭电多校02

【原文链接】 (补发)题解|2023暑期杭电多校02 1002.Binary Number 字符串、贪心 题目大意 给定一段长度为 n n n的01串,首位保证为1 任选定其中任意长的一段并将其反转 必须执行以上操作 k k k次,求操作后得到的01串表示的二进…

JAVA.2.运算符

目录 1.算术运算符 小数有可能会不精确,整数除以整数得整数 例子 package demo1;public class Hello {public static void main(String[] args) {System.out.println(12);System.out.println(1-2);System.out.println(5/2);System.out.println(5.0/2);System.out.…

代码随想录移除元素二刷

代码随想录移除元素二刷 leetcode 27 这道题思路的话可以这样去理解,用两个指针,一个慢指针,一个快指针。先让快指针往前面去探路,也就是去遍历数组,遇到不为val的值再去把该值赋值给nums[slow],slow指针1…

3.1、matlab双目相机标定实验

1、双目相机标定原理及流程 双目相机标定是将双目相机系统的内外参数计算出来,从而实现双目视觉中的立体测量和深度感知。标定的目的是确定各个摄像头的内部参数(如焦距、主点、畸变等)和外部参数(如相机位置、朝向等&#xff09…

uni-app 影视类小程序开发从零到一 | 开源项目分享

引言 在数字娱乐时代,移动设备已成为我们生活中不可或缺的一部分,尤其是对于电影爱好者而言,随时随地享受精彩影片成为一种日常需求。爱影家,一款基于 uni-app 开发的影视类小程序,正是为此而生。它不仅提供了丰富的影…

北京交通大学《深度学习》专业课,实验3卷积、空洞卷积、残差神经网络实验

一、实验要求 1. 二维卷积实验(平台课与专业课要求相同) ⚫ 手写二维卷积的实现,并在至少一个数据集上进行实验,从训练时间、预测精 度、Loss变化等角度分析实验结果(最好使用图表展示) ⚫ 使用torch.nn…

基于ffmepg的视频剪辑

1.ffmpeg命令实现视频剪辑 FFmpeg是一个非常强大的视频处理工具,可以用来剪辑视频。以下是一个基本的FFmpeg命令行示例,用于剪辑视频: $ ffmpeg -i ./最后一滴水.mp4 -ss 0:0:20 -t 50 -c copy output.mp4-i ./最后一滴水.mp4 输入文件  …

利用PyTorch进行模型量化

利用PyTorch进行模型量化 目录 利用PyTorch进行模型量化 一、模型量化概述 1.为什么需要模型量化? 2.模型量化的挑战 二、使用PyTorch进行模型量化 1.PyTorch的量化优势 2.准备工作 3.选择要量化的模型 4.量化前的准备工作 三、PyTorch的量化工具包 1.介…

Linux复习02

一、什么是操作系统 操作系统是一款做软硬件管理的软件! 一个好的操作系统,衡量的指标是:稳定、快、安全 操作系统的核心工作: 通过对下管理好软硬件资源的手段,达到对上提供良好的(稳定,快…

【MindSpore学习打卡】应用实践-LLM原理和实践-文本解码原理 —— 以MindNLP为例

在自然语言处理(NLP)领域,文本生成是一项重要且具有挑战性的任务。从对话系统到自动文本补全,文本生成技术无处不在。本文将深入探讨自回归语言模型的文本解码原理,使用MindNLP工具进行示例演示,并详细分析…

240719_图像二分类任务中图像像素值的转换-[0,255]-[0,1]

240719_图像二分类任务中图像像素值的转换-[0,255]-[0,1] 在做语义分割二分类任务时,有时下载到的数据集或者我们自己制作的数据集,标签像素值会是[0,255](或者含有一些杂乱像素),但在该类任务中,往往0代表…

androidkiller重编译apk失败的问题

androidkiller重编译apk失败 参考: https://blog.csdn.net/qq_38393271/article/details/127057187 https://blog.csdn.net/hkz0704/article/details/132855098 已解决:“apktool” W: invalid resource directory name:XXX\res navigation 关键是编译…

脑肿瘤有哪些分类? 哪些人会得脑肿瘤?

脑肿瘤,作为一类严重的脑部疾病,其分类复杂多样,主要分为原发性脑肿瘤和脑转移瘤两大类。原发性脑肿瘤起源于颅内组织,常见的有胶质瘤、脑膜瘤、生殖细胞瘤、颅内表皮样囊肿及鞍区肿瘤等。其中,胶质瘤作为最常见的脑神…

# Redis 入门到精通(九)-- 主从复制

Redis 入门到精通(九)-- 主从复制(1) 一、redis 主从复制 – 主从复制简介 1、互联网“三高”架构 高并发高性能高可用 2、你的“Redis”是否高可用? 1)单机 redis 的风险与问题 问题1.机器故障  现…

WeTest 海外本地化测试的全生命周期服务 第一期

伴随全球化和数字化的加速推进,越来越多的国内企业希望将其产品服务推向国际,以便在全球数字市场中占有一席之地。除去传统的欧美市场,国内企业也积极开拓东南亚、南亚、拉美、中东和非洲等新兴市场。这些地区的互联网普及率和数字化需求正在…

vue+watermark-dom实现页面水印效果

前言 页面水印大家应该都不陌生,它可以用于验证数字媒体的来源和完整性,还可以用于版权保护和信息识别,这些信息可以在不影响媒体质量的情况下嵌入,‌并在需要时进行提取。‌本文将通过 vue 结合 watermark-dom 库,教大…

《AIGC 实战宝典》(2024版) 正式发布!

2024 新年伊始,OpenAI 推出文生视频 Sora,风靡整个科技圈。 最近又发布了 ChatGPT-4o,这是一个全新模型,不仅能处理文本,还能实时理解和生成音频和图像。OpenAI 用实际行动给全世界的科技公司又上了一课。 如何从0到1…

零基础STM32单片机编程入门(十五) DHT11温湿度传感器模块实战含源码

文章目录 一.概要二.DHT11主要性能参数三.DHT11温度传感器内部框图四.DTH11模块原理图五.DHT11模块跟单片机板子接线和通讯时序1.单片机跟DHT11模块连接示意图2.单片机跟DHT11模块通讯流程与时序 六.STM32单片机DHT11温度传感器实验七.CubeMX工程源代码下载八.小结 一.概要 DH…

offer题目51:数组中的逆序对

题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7…

[Vulnhub] TORMENT IRC+FTP+CUPS+SMTP+apache配置文件权限提升+pkexec权限提升

信息收集 IP AddressOpening Ports192.168.101.152TCP:21,22,25,80,111,139,143,445,631 $ nmap -p- 192.168.101.152 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or later | ftp-anon: Anonymous FTP login a…