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

news/2024/12/23 4:10:02/

目录

一、概述

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)。

python">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完整代码

python">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去除低密度点云

3d011be0523.png" width="388" />


http://www.ppmy.cn/news/1506318.html

相关文章

AcWing 714. 连续奇数的和 1

给定两个整数 XX 和 YY&#xff0c;输出在他们之间&#xff08;不包括 XX 和 YY&#xff09;的所有奇数的和。 输入格式 第一行输入 XX&#xff0c;第二行输入 YY。 输出格式 输出一个整数&#xff0c;表示所有满足条件的奇数的和。 数据范围 −100≤X,Y≤100−100≤X,Y≤…

【Canvas与艺术】蓝波纹白底黄星徽章

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>蓝波纹白底黄星徽章</title><style type"text/css&quo…

算法的效率度量——时间复杂度

算法的效率度量 算法的效率度量: 时间复杂度空间复杂度 时间复杂度 如何评估算法的时间开销? ——让算法先运行&#xff0c;事后统计运行时间&#xff1f; 存在问题: 和机器性能有关。如&#xff1a;超级计算机VS单片机和编程语言有关&#xff0c;越高级的语言执行效率越低…

vs+qt一些问题

一直遇到的两个问题&#xff0c;今天解决了 1、 因为前后端分离&#xff0c;前端写完了&#xff0c;后端还在一直修改&#xff0c;但是每次都是单独打开的后端的sln&#xff0c;所以会出现这个&#xff0c;把前端的模块删掉就好了。 2、打开vs项目&#xff0c;很多报错&#…

高级网络渗透测试技术(第一篇)

一、概述 网络渗透测试&#xff08;Penetration Testing, Pen Test&#xff09;是通过模拟恶意攻击者的行为来评估计算机系统、网络或Web应用的安全性。高级网络渗透测试技术则涵盖了更复杂和深入的测试方法&#xff0c;能够更有效地发现并利用系统中的潜在漏洞。 二、前期准…

Bytebase 2.22.1 - SQL 编辑器展示更丰富的 Schema 信息

&#x1f680; 新功能 SQL 编辑器直接展示表&#xff0c;视图&#xff0c;函数&#xff0c;存储过程等各种 Schema 详情。OpenAI 功能进入社区版&#xff08;免费&#xff09;&#xff0c;现在您可以通过配置自有 OpenAI key 在 SQL 编辑器中启用自然语言转 SQL 功能。支持在 …

JavaScript - 变量声明(let、const 和其他)

目录 一、引言 1. let 的作用 2. const 的作用 3. let 与 const 的选择 4. let 和 const 的性能 5. var, let, const 的对比 6. 常见误区 二、其他变量定义 1. var 关键字 2. 全局对象属性 3. 使用 IIFE&#xff08;立即调用函数表达式&#xff09; 4. ES6 模块 总结 …

计算机组成原理(2)[1]:数据的表示和运算基本概念

1 1.1 进位计数制 进制计算制机器相互转换 古老的计数方法 十进制计数法 为什么习惯 是因为人有10个手指 逢十进一 r进制计数法&#xff1a; 基于八进制的加法是逢8进1&#xff01;0.40.41 二进制适合计算机&#xff1f;&#xff1a; 逻辑门电路也是处理二进制的元器件&…