Open3D Ransac算法拟合点云球面

目录

一、概述

二、代码实现

2.1关键函数

2.2完整代码

三、实现效果

3.1原始点云

3.2拟合后点云


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

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

一、概述

        RANSAC(RANdom SAmple Consensus)是一种用于估计数学模型参数的迭代方法,尤其适用于包含大量异常值的数据。它通过反复从数据集中随机抽取子集进行拟合,评估模型的适用性,并最终选择内点最多的模型作为最佳拟合。

要使用 RANSAC 算法拟合三维点云球面,可以按照以下步骤进行实现。
1.生成带噪声的球面点云数据:
        - 创建一个三维球面点云,并添加噪声以模拟实际数据。
2.定义 RANSAC 球面拟合算法:
        - 使用 RANSAC 算法从带噪声的点云中拟合出一个球面。
3.可视化拟合结果:
        - 使用 Open3D 可视化原始点云和拟合的球面。

二、代码实现

2.1关键函数

fit 函数是 pyrsc 库中 Sphere 类的方法,用于使用 RANSAC 算法拟合三维点云数据中的球面。

class Sphere():|  Sphere()def fit(self, pts, thresh=0.2, maxIteration=1000):

输入参数

  • points:三维点云数据,形状为 (N, 3) 的 numpy 数组,其中 N 是点的数量。每个点包含 x, y, z 坐标。
  • thresh:内点距离阈值,默认为 0.05。用于判断一个点是否属于拟合的球面。如果点到球面的距离小于该阈值,则认为该点是内点。
  • maxIteration:RANSAC 算法的最大迭代次数,默认为 1000。算法将在该次数内尝试找到最佳拟合模型。更多的迭代次数可以提高找到最佳拟合的概率。

返回值

  • center:拟合的球面的球心坐标 (cx, cy, cz)。
  • radius:拟合的球面的半径 r。
  • inliers:内点索引列表,包含所有符合拟合球面条件的点的索引。

2.2完整代码

import open3d as o3d
import numpy as np
import pyransac3d as pyrscdef generate_noisy_sphere(radius=1.0, num_points=1000, noise_level=0.05):"""生成一个带有噪声的三维球面点云。参数:radius (float): 球的半径,默认为 1.0。num_points (int): 点云中的点的数量,默认为 1000。noise_level (float): 噪声水平,默认为 0.05。返回:numpy.ndarray: 生成的点云数据。"""phi = np.random.uniform(0, np.pi, num_points)theta = np.random.uniform(0, 2 * np.pi, num_points)x = radius * np.sin(phi) * np.cos(theta)y = radius * np.sin(phi) * np.sin(theta)z = radius * np.cos(phi)points = np.vstack((x, y, z)).T# 添加噪声noise = np.random.normal(0, noise_level, points.shape)noisy_points = points + noisereturn noisy_pointsdef create_sphere_mesh(cx, cy, cz, r, resolution=20):"""创建一个球形的 Mesh,用于可视化。参数:cx (float): 球心的 x 坐标。cy (float): 球心的 y 坐标。cz (float): 球心的 z 坐标。r (float): 球的半径。resolution (int): 球的分辨率,默认为 20。返回:open3d.geometry.TriangleMesh: 球形 Mesh 对象。"""sphere = o3d.geometry.TriangleMesh.create_sphere(radius=r, resolution=resolution)sphere.translate([cx, cy, cz])sphere.paint_uniform_color([1, 0, 0])  # 设置颜色为红色return sphere# 生成带有噪声的三维球面点云
radius = 1.0
num_points = 1000
noise_level = 0.05
points = generate_noisy_sphere(radius, num_points, noise_level)# 使用 pyrsc 库中的 RANSAC 进行球面拟合
sphere = pyrsc.Sphere()
center, radius, inliers = sphere.fit(points, thresh=0.05, maxIteration=1000)# 创建点云对象
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)# 给点云设置颜色为蓝色
pcd.paint_uniform_color([0, 0, 1])
# 可视化点云
o3d.visualization.draw_geometries([pcd], window_name="pcd",width=800, height=600, left=50, top=50)
# 创建拟合球的 Mesh 对象
cx, cy, cz = center
sphere_mesh = create_sphere_mesh(cx, cy, cz, radius)# 可视化点云和拟合的球
o3d.visualization.draw_geometries([pcd, sphere_mesh], window_name="RANSAC Sphere Fitting with pyrsc",width=800, height=600, left=50, top=50)

三、实现效果

3.1原始点云

3.2拟合后点云

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

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

相关文章

【Chatgpt大语言模型医学领域中如何应用】

随着人工智能技术 AI 的不断发展和应用,ChatGPT 作为一种强大的自然语言处理技术,无论是 自然语言处理、对话系统、机器翻译、内容生成、图像生成,还是语音识别、计算机视觉等方面,ChatGPT 都有着广泛的应用前景。特别在临床医学领…

python 语法学习 day6

一.编程题错题反思 1.计算分段函数: x float(input()) if x 0: res 0 else: res 1 / (2 * x) print("g({:.3f}) {:.3f}".format(x, res)) #其中对于f,e和%格式&…

pycharm如何debug for循环里面的错误值

一般debug时,在for循环里面的话,需要自己一步一步点。如果循环几百次那种就比较麻烦。此时可以采用try except的方式来解决 例子如下 #ptyhon debug for循环的代码 num[1,2,3,s,4] ans0 for i in num:try:ansiexcept:print(错误) print(ans) 结果如下&a…

HTML+echarts.js实现的炫酷金色风格可视化组件

模板下载地址: 炫酷金色风格可视化组件 (bootstrapmb.com)https://www.bootstrapmb.com/item/14888 一款炫酷金色风格可视化组件,统计图表使用Echarts.js,整体风格采用金黄色看起来很大气,设计是通用型的,可以用作任…

自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍

文章目录 1. 背景介绍2. 功能定义3. 功能原理4. 传感器架构5. 实际应用案例5.1 典型场景1:前方车辆压线5.2 典型场景2:相邻车道有大型车辆5.3 典型场景3:它车近距离cut in 6. 总结与展望 1. 背景介绍 随着汽车技术的发展,智能巡航…

springboot开发实用篇

一、Mongodb (1)简介 MongoDB是一个开源、高性能、无模式的文档型数据库。NoSQL数据库产品中的一种,是最像关系型数据库的非关系型数据库。 数据库:永久性存储,修改频率极低 Mongodb:永久性存储与临时存…

Cxx Primer-Chap4

表达式可以没有操作符,但一定有操作数:理解表达式中含有多个操作符时涉及操作符的优先级、关联性以及操作数的计算顺序:如果操作符需要的操作数类型不同,则会发生一些默认的类型转换:什么叫Overloaded Operators&#…

跨平台应用进程cpu与内存监控的搭建说明

1. 前言: 随着科技的进步,互联网发展,能网上办理的就网上办理,按装一个app客户端,连接后台服务,只要是有网络就OK.便捷,快速,省事.但随之而来的是pc端上安装的应用越来越多,系统资源越来越不够用.这也一定程度上对应用程序有一定的要求,除了实现其功能外,性能也是需要关注的. …

python如何输入矩阵

使用numpy创建矩阵有2种方法,一种是使用numpy库的matrix直接创建,另一种则是使用array来创建。 首先导入numpy: (1)import numpy (2)from numpy import * (3)import …

【JVM】JVM调优练习-随笔

JVM实战笔记-随笔 前言字节码如何查看字节码文件jclasslibJavapArthasArthurs监控面板Arthus查看字节码信息 内存调优内存溢出的常见场景解决内存溢出发现问题Top命令VisualVMArthas使用案例 Prometheus Grafana案例 堆内存情况对比内存泄漏的原因:代码中的内存泄漏并发请求问…

MenuToolButton自绘控件,带下拉框的QToolButton,附源码

MenuToolButton自绘控件,带下拉框的QToolButton 效果 下拉样式可自定义 跟随QToolButton的Qt::ToolButtonStyle属性改变图标文字样式 使用示例 正常UI文件创建QToolButton然后提升,或者直接代码创建都可以。 // 创建一个 QList 对象来存储 QPixm…

关于MySQL的一些相关规定

1.为什么阿里巴巴规定不能超过三张表join 之所以不建议使用join查询,最主要的原因就是join的效率比较低。 MySQL是使用了嵌套循环(Nested-Loop Join)的方式来实现关联查询的,简单点说就是要通过两层循环,用第一张表做…

TDC 5.0:多集群统一纳管,构建一体化大数据云平台

近期,星环科技数据云平台Transwarp Data Cloud(简称TDC)5.0版本正式发布,TDC5.0架构屏蔽底层多个TDH集群的差异,采用统一操作模式,新增一个多集群抽象与管理层,能够实现多集群网络互通、跨集群资…

使用 RocketMQ 实现消息的顺序消费

在分布式系统中,保持消息的顺序性是一个常见且重要的问题。RocketMQ 提供了一种有效的方式来确保消息的顺序消费。本文将通过代码示例,介绍如何使用 RocketMQ 实现消息的顺序生产和消费。 环境准备 在开始之前,请确保您已经配置好 RocketMQ…

QT纯代码实现滑动开关控件

开关按钮大家应该很熟悉,在设置里面经常遇到,切换时候的滑动效果比较帅气。通常说的开关按钮,有两个状态:on、off。大部分的开关按钮控件,基本上有两大类,第一类是纯代码绘制,这种对代码的掌控度…

dhtmlx-gantt甘特图数据展示

官网文档&#xff1a;甘特图文档 实现效果&#xff1a; 首先需要下载 dhtmlx-gantt组件 npm i dhtmlx-gantt //我项目中使用的是"dhtmlx-gantt": "^8.0.6" 这个版本&#xff0c;不同的版本api或是文档中存在的方法稍有差异 界面引用 <template>&l…

目标检测算法与应用算法 DS集成 接口相关_v0.1

目录 文章目录 目录0. 目标GPS信息、速度、加速度、航向角信息的输出1. 目标检测算法接口1.1 模型相关1.2 检测结果相关 2. 应用算法接口2.1 bool cross_line; //跨线&#xff08;变道压线检测&#xff09;2.2 bool break_in; //闯入&#xff08;目标闯入&#xff09;2.3 bool …

Linux HOOK机制与Netfilter HOOK

一. 什么是HOOK&#xff08;钩子&#xff09; 在计算机中&#xff0c;基本所有的软件程序都可以通过hook方式进行行为拦截&#xff0c;hook方式就是改变原始的执行流。 二. Linux常见的HOOK方式 1、修改函数指针。 2、用户态动态库拦截。 ①利用环境变量LD_PRELOAD和预装载机…

【Python】python中list的迭代

什么是迭代&#xff1a; 迭代其实就是遍历整个数据结构 nums [3,4,5] for n in nums:print(n)上述代码中&#xff0c;我们定义了一个nums列表&#xff0c;并且使用for循环对其进行遍历。其实整个过程就是迭代&#xff0c;所谓迭代&#xff0c;就是对数据集中每一个元素对其进…

STM32自己从零开始实操:PCB全过程

一、PCB总体分布 以下只能让大家看到各个模块大致分布在板子的哪一块&#xff0c;只能说每个人画都有自己的理由&#xff1a; 电源&#xff1a;从外部接入电源&#xff0c;5V接到中间&#xff0c;向上变成4V供给无线&#xff0c;向下变成3V供给下面的接口&#xff08;也刻意放…