Open3D 三维重建-Poisson Surface Reconstruction (泊松曲面重建)

目录

一、概述

1.1原理

1.2实现步骤

1.3应用

二、代码实现

2.1关键函数

2.1.1函数代码

2.1.2参数详解

2.1.3名词解释

2.2完整代码

三、实现效果

3.1原始点云

3.2重建后点云

3.3去除低密度点云


Open3D点云算法汇总及实战案例汇总的目录地址:

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


一、概述

1.1原理

        泊松曲面重建是一种用于从点云数据生成光滑曲面的算法。该方法基于泊松方程,通过最小化法向量场的散度,生成具有光滑特性的三维表面。具体来说,泊松曲面重建将点云的法向量信息视为泊松方程中的源项,通过解泊松方程,得到一个光滑的隐函数。然后,通过提取隐函数的等值面,生成三维网格。

1.2实现步骤

  1. 加载点云数据:读取点云数据文件。
  2. 估计法向量计算点云中每个点的法向量,通常使用KD树进行邻域搜索。
  3. 泊松曲面重建:使用泊松方程重建三维曲面,生成三角网格。
  4. 后处理:使用顶点密度信息去除低密度区域。
  5. 可视化和保存结果:可视化重建结果,并将生成的三角网格保存到文件中。

1.3应用

  • 三维重建:从点云数据生成完整的三维表面,用于建筑、文物的数字化。
  • 计算机视觉:用于物体识别和场景理解。
  • 医学成像:从扫描数据重建器官和组织的三维结构。

二、代码实现

2.1关键函数

2.1.1函数代码

        使用 create_from_point_cloud_poisson 函数进行泊松曲面重建,生成三角网格(mesh)和顶点密度(densities)。

def create_from_point_cloud_poisson(self, pcd, depth=8, width=0, scale=1.1, linear_fit=False, n_threads=-1):"""从点云数据进行泊松曲面重建。参数:pcd (open3d.geometry.PointCloud): 输入的点云对象,包含点的位置和法向量信息。depth (int, optional): 八叉树的最大深度,控制重建的细节程度。默认值为8。width (int, optional): 八叉树宽度的参数,通常与 depth 结合使用。默认值为0。scale (float, optional): 设置重建的细节比例,值越大,生成的网格越精细。默认值为1.1。linear_fit (bool, optional): 是否进行线性拟合以改进法向量估计的精度。默认值为False。n_threads (int, optional): 线程数。默认值为-1,表示使用所有可用线程。返回:mesh (open3d.geometry.TriangleMesh): 生成的三角网格。densities (open3d.utility.Vector3dVector): 每个顶点的密度值。"""

2.1.2参数详解

1.pcd (open3d.geometry.PointCloud):
        - 输入的点云对象,需要包含点的位置和法向量信息。法向量用于泊松曲面重建中的法向量场。
2.depth (int, optional, default=8):
        - 八叉树的最大深度,控制重建的细节程度。较大的深度值会生成更细致的网格,但计算时间也会增加。
        - 推荐值范围:5到12。
        - 较小的值(如5)会生成较粗糙的网格,适用于大规模的点云数据。
        - 较大的值(如12)会生成较精细的网格,适用于高分辨率的点云数据。
3.width (int, optional, default=0):
        - 用于指定八叉树宽度的参数,通常与depth结合使用。如果设置为0,将自动计算合适的宽度。
4.scale (float, optional, default=1.1):
        - 用于设置重建的细节比例。值越大,生成的网格越精细。
        - 影响到八叉树的构建,典型值在1到2之间。
5.linear_fit (bool, optional, default=False):
        - 如果设置为True,将进行线性拟合以改进法向量估计的精度
        - 适用于存在噪声或不完整数据的点云。

2.1.3名词解释

1.八叉树(Octree):
        - 八叉树是一种用于空间划分的数据结构,将三维空间递归地划分为更小的立方体。深度参数控制了八叉树的递归层数,层数越多,划分越细,生成的网格也越精细。
2.法向量场(Normal Field):
        - 法向量场是点云中每个点的法向量的集合。泊松曲面重建通过最小化法向量场的散度,生成一个光滑的隐函数。法向量的估计对重建结果有重要影响,因此在重建之前,需要为点云估计法向量。
3.泊松方程(Poisson Equation):
        - 泊松方程是一种偏微分方程,描述了隐函数的行为。泊松曲面重建通过解这个方程,得到一个隐函数,然后通过提取等值面,生成三维网格。

2.2完整代码

import open3d as o3d
import numpy as np
from matplotlib import pyplot as pltpcd = o3d.io.read_point_cloud("hand_trans.pcd")
print(pcd)  # 输出点云点的个数
# -----------------------计算法线------------------------
# 搜索半径0.01m,只考虑邻域内的30个点
pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30))print('run Poisson surface reconstruction')
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd, depth=9)
print(mesh)
o3d.visualization.draw_geometries([mesh])# -----------使用伪颜色显示3D中的密度。--------------------
#        紫色代表低密度,黄色代表高密度。
print('visualize densities')
densities = np.asarray(densities)
density_colors = plt.get_cmap('plasma')((densities - densities.min()) / (densities.max() - densities.min()))
density_colors = density_colors[:, :3]
density_mesh = o3d.geometry.TriangleMesh()
density_mesh.vertices = mesh.vertices
density_mesh.triangles = mesh.triangles
density_mesh.triangle_normals = mesh.triangle_normals
density_mesh.vertex_colors = o3d.utility.Vector3dVector(density_colors)
o3d.visualization.draw_geometries([density_mesh])# -------------删除所有密度值低于0.01的区域。---------------
print('remove low density vertices')
vertices_to_remove = densities < np.quantile(densities, 0.01)
mesh.remove_vertices_by_mask(vertices_to_remove)
print(mesh)
o3d.visualization.draw_geometries([mesh])

三、实现效果

3.1原始点云

3.2重建后点云

3.3去除低密度点云

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

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

相关文章

Linux快速切换/完善内核

看到标题就晓得是为啥而写的吧&#xff0c;没错&#xff0c;它就是记录Linux的内核切换的一些常见问题&#xff0c;尽可能把平时一些经验和真实有效的心得写下来&#xff0c;同时也希望可以给需要切换内核版本的大伙带来方便&#xff0c;感受到"小小内核切换"竟然如此…

某赛通电子文档安全管理系统 CDGAuthoriseTempletService1 SQL注入漏洞复现(XVE-2024-19611)

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

高效的编程学习方法和技巧

编程小白如何成为大神&#xff1f;大学新生的最佳入门攻略 编程已成为当代大学生的必备技能&#xff0c;但面对众多编程语言和学习资源&#xff0c;新生们常常感到迷茫。如何选择适合自己的编程语言&#xff1f;如何制定有效的学习计划&#xff1f;如何避免常见的学习陷阱&…

关于区块链的公共医疗应用开发

区块链的养老保险平台应用开发 任务一:环境准备 1.编译区块链网络 目录:/root/xuperchain/ 在区块链网络目录下执行make命令,编译网络,编译成功后输出compile done! 启动区块链网络 2.创建钱包账户 创建普通钱包账户userTest,命令如下 bin/xchain-cli account newke…

【linux|001】Unix和Linux的关系 及 它们的发展历史

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 ​ &#x1f3c5;阿里云ACE认证高级工程师 ​ &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社…

win7系统postman11.7错误:无法定位程序输入点DiscardVirtualMemory于动态链接库KERNEL32.dlI 上

目录 前言&#xff1a;环境描述 一、问题描述 二、问题定位 三、解决方案 1、卸载最新版&#xff0c;安装原来可用的旧版 2、postman禁止自动更新 四、错误的解决方案 1、重启电脑 2、以为是 KERNEL32.dlI 丢失 3、注册 kernel32.dll 4、使用Windows自带的系统文件检…

PPT免费图片素材网站分享

一、Pixabay 网址&#xff1a;https://pixabay.com/ 图片类型&#xff1a;高清、免费、商用 使用方法&#xff1a;找到想要的图片之后&#xff0c;右键复制之后粘贴到PPT即可使用。同时&#xff0c;点击下载可以找到不同尺寸的PPT素材 二、花瓣网 网址&#xff1a;https://…

mysql事务与索引

1.事务 &#xff08;1&#xff09;提出背景&#xff1a; 在日常开发环境中&#xff0c;有一些场景是需要“一气呵成”完成某一个操作。 eg&#xff1a;银行转账的场景&#xff1a;张三&#xff08;手里有1000&#xff09;现要给李四&#xff08;手里有500&#xff09;转500&…

零基础5分钟上手亚马逊云科技AWS核心云开发/云架构 - 创建高可用数据库集群

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;让大家零基础5分钟通过这篇文章就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我将每天介绍一个基于亚马逊云科…

Go开发后端和Vue3开发前端的前后端分离框架中自己手戳一个OA流程审批、工作流引擎给新时代一个漂亮便捷的工作流引擎

前言 在软件项目开发中&#xff0c;我们都会接触到流程审批的需要业务&#xff0c;我们以往用的最多就是如下图这种流程编辑引擎插件&#xff1a; 以上截图中的流程工具是不是大家常见的呀&#xff01;感觉很丑拿不出手呀&#xff01;在当前行业内卷及竞争激烈情况下&#xff…

Docker Compse单机编排

一.Docker Compse 介绍 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;你可以使用 YAML 文件来配置应用程序的服务、网络和卷&#xff0c;然后使用单个命令创建和启动所有服务。这使得在开发、测试和部署过程中管理多容器应用程…

鸿蒙(API 12 Beta3版)【AVCodec Kit简介】 音视频编码服务

AVCodec kit&#xff08;Audio & Video Codec Kit&#xff0c;音视频编解码&#xff0c;封装解封装原子能力&#xff09;是媒体系统中的音视频的编解码、媒体文件的解析、封装、媒体数据输入等原子能力。 能力范围 媒体数据输入&#xff1a;媒体应用可以传入文件fd、或者…

TM1652段码屏芯片全解析——概况,性能,MCU连接,样例代码

首先&#xff0c;作为四年前就有的LED段码控制芯片&#xff0c;相关的资料及样例程序少的可怜。硬件驱动 作为固定使用的 软件资源&#xff0c;其共享性远低于软件领域的驱动库。人的才智不应浪费在这种不具创造性的重复实验上。 要点总结&#xff1a; TM1652概述&#xff1a…

【网络层】IP报文解析和网段划分

文章目录 网络层的作用IP协议协议报头格式网段划分DHCPCIDR划分方案 IP地址的数量限制私有IP地址和公网IP地址LAN和WAN 路由 网络层的作用 前面学习了应用层和传输层&#xff0c;应用层的作用是为用户和应用程序提供网络服务&#xff0c;传输层的作用是提供端口到端口的通信服…

数据结构与算法--二叉树的遍历及应用

文章目录 回顾二叉树的五个重要性质 提要二叉树的遍历二叉树遍历流程图前序遍历流程图&#xff08;根左右&#xff09;中序遍历流程图&#xff08;左根右&#xff09;后序遍历流程图&#xff08;左右根&#xff09; 二叉树遍历的示例根据遍历序列确定二叉树的形态确定方法 二叉…

界面组件Kendo UI for Vue 2024 Q2亮点 - 发布一系列新组件

随着最新的2024年第二季度发布&#xff0c;Kendo UI for Vue为应用程序开发设定了标准&#xff0c;包括生成式AI集成、增强的设计系统功能和可访问的数据可视化。新的2024年第二季度版本为应用程序界面提供了人工智能(AI)提示&#xff0c;从设计到代码的生产力增强、可访问性改…

arXiv2024.8.6 | LLaVA-OneVision:Easy Visual Task Transfer

Comment: Project Homepage: https://llava-vl.github.io/blog/2024-08-05-llava-onevision/ 论文标题&#xff1a;LLaVA-OneVision&#xff1a;Easy Visual Task Transfer 论文地址&#xff1a;https://arxiv.org/abs/2408.03326 GitHub&#xff1a;https://llava-vl.githu…

MTK Android12 SystemUI 手势导航 隐藏导航栏底部布局

问题:android12 平台手势导航情况下,app页面未设置全屏情况下,底部导航栏会有一个高度的颜色,底部导航会有一个手势导航提示条 需求:去掉手势导航情况下底部的导航栏和手势提示条 文章目录 相关资源修改问题描述解决方案代码跟踪中间提醒小方块代码查找底部手势导航条跟踪…

【实战】MFC客户端Python后端之仿造QQ聊天

项目概述 这里介绍一个很多年以前做的一个小项目&#xff0c;新手小白可以参考学习。本项目旨在开发一个功能丰富的即时通讯及聊天室系统&#xff0c;类似于QQ&#xff0c;具备客户端与服务端通讯、多人聊天室、界面友好度、一对一聊天、通讯内容加密、服务端与数据库交互等功能…

【学习笔记】Matlab和python双语言的学习(非线性规划法)

文章目录 前言一、非线性规划法二、例题&#xff1a;选址问题1.确定决策变量2.确定约束条件3.确定目标函数4.建立模型5.求解 三、代码实现----Matlab1.Matlab 的 fmincon 函数&#xff08;1&#xff09;基本用法&#xff08;2&#xff09;简单示例 2.Matlab 代码第一问&#xf…