7.Open3D教程——表面重建

2023-05-16

在许多情况下,我们希望生成密集的三维几何体,即三角形网格。然而,从多视点立体方法,或深度传感器,我们只能获得一个非结构化的点云。为了从非结构化输入中得到三角形网格,我们需要执行曲面重建。文献中有几种方法,Open3D目前实现了以下功能:

  • Alpha shapes [Edelsbrunner1983]
  • Ball pivoting [Bernardini1999]
  • Poisson surface reconstruction [Kazhdan2006]

1. Alpha shapes

alpha形[Edelsbrunner1983]是凸壳的推广。正如这里所描述的那样,人们可以直观地把阿尔法形状想象成如下所示:想象一个巨大的冰激凌包含点S作为硬巧克力块。使用其中一个球形冰激凌勺子,我们可以雕刻出冰激凌块的所有部分,而不会撞到巧克力块,从而甚至可以在内部雕刻出孔(例如,通过简单地从外部移动勺子无法触及的部分)。我们最终会得到一个(不一定是凸的)由帽,弧和点限定的对象。如果我们现在把所有的面拉直成三角形和线段,我们就可以直观地描述S的alpha形状。

Open3D实现了一个方法create_from_point_cloud_alpha_shape,该方法涉及到权衡参数alpha

import open3d as o3d
import numpy as np
import open3d_tutorial as o3dtut

mesh = o3dtut.get_bunny_mesh()
pcd = mesh.sample_points_poisson_disk(750)
o3d.visualization.draw_geometries([pcd])
alpha = 0.03
print(f"alpha={alpha:.3f}")
mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha)
mesh.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh], mesh_show_back_face=True)

实现是基于点云的凸包。如果我们想从一个给定的点云计算多个alpha形状,那么我们可以通过只计算一次凸包并传递它来从create_from_point_cloud_alpha_shape来节省一些计算。

tetra_mesh, pt_map = o3d.geometry.TetraMesh.create_from_point_cloud(pcd)
for alpha in np.logspace(np.log10(0.5), np.log10(0.01), num=4):
    print(f"alpha={alpha:.3f}")
    mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(
        pcd, alpha, tetra_mesh, pt_map)
    mesh.compute_vertex_normals()
    o3d.visualization.draw_geometries([mesh], mesh_show_back_face=True)

2. Ball pivoting

球旋转算法(BPA)[Bernardini1999]是一种与α形状相关的曲面重建方法。直观地说,想象一个给定半径的三维球,我们把它放在点云上。如果它碰到任何3个点(并且它没有穿过这3个点),它就会创建一个三角形。然后,该算法从现有三角形的边开始旋转,每次它击中球没有穿过的3个点,我们就创建另一个三角形。

Open3D在create_from_point_cloud_ball_pivoting中实现了这个方法。该方法接受半径列表作为参数,该参数对应于以点云为轴的各个球的半径。

import open3d as o3d
import numpy as np
import open3d_tutorial as o3dtut

gt_mesh = o3dtut.get_bunny_mesh()
gt_mesh.compute_vertex_normals()
pcd = gt_mesh.sample_points_poisson_disk(3000)
o3d.visualization.draw_geometries([pcd])
radii = [0.005, 0.01, 0.02, 0.04]
rec_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(
    pcd, o3d.utility.DoubleVector(radii))
o3d.visualization.draw_geometries([pcd, rec_mesh])

3. Poisson 表面重建

Poisson曲面重建方法解决了一个正则化优化问题以获得光滑曲面。因此,Poisson曲面重建比上述方法更可取,因为它们产生非光滑结果,因为点云的点也是生成的三角形网格的顶点,而无需任何修改。

Open3D实现了create_from_point_cloud_poisson的方法,基本上是Kazhdan代码的包装。函数的一个重要参数是depth,它定义了用于曲面重建的八叉树的深度,因此意味着生成的三角形网格的分辨率。“深度”(depth)值越高,表示网格的细节越多。

import open3d as o3d
import numpy as np
import open3d_tutorial as o3dtut

pcd = o3dtut.get_eagle_pcd()
print(pcd)
o3d.visualization.draw_geometries([pcd])
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],
                                  zoom=0.664,
                                  front=[-0.4761, -0.4698, -0.7434],
                                  lookat=[1.8900, 3.2596, 0.9284],
                                  up=[0.2304, -0.8825, 0.4101])

泊松曲面重建还将在低密度区域创建三角形,甚至可以外推到某些区域(请参见上面eagle输出的底部)。create_from_point_cloud_poisson函数具有第二个密度返回值,该值指示每个顶点的密度。“低密度”(low density)值表示顶点仅由输入点云的少量点支持。

在下面的代码中,我们使用伪彩色在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],
                                  zoom=0.664,
                                  front=[-0.4761, -0.4698, -0.7434],
                                  lookat=[1.8900, 3.2596, 0.9284],
                                  up=[0.2304, -0.8825, 0.4101])

我们可以进一步使用“密度”(density)值删除支持度较低的顶点和三角形。在下面的代码中,我们删除了密度值低于所有密度值的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],
                                  zoom=0.664,
                                  front=[-0.4761, -0.4698, -0.7434],
                                  lookat=[1.8900, 3.2596, 0.9284],
                                  up=[0.2304, -0.8825, 0.4101])

4. 正态估计

在上面的示例中,我们假设点云具有指向外部的法线。但是,并非所有的点云都已经具有关联的法线。Open3D可以用来估计点云法线,使用“估计法线”(estimate\u normals)对每个3D点局部拟合一个平面以导出法线。但是,估计的法线方向可能不一致。使用orient_normals_consistent_tangent_plane可以生成最小树传播法线方向。

import open3d as o3d
import numpy as np
import open3d_tutorial as o3dtut

gt_mesh = o3dtut.get_bunny_mesh()
pcd = gt_mesh.sample_points_poisson_disk(5000)
pcd.normals = o3d.utility.Vector3dVector(np.zeros(
    (1, 3)))  # invalidate existing normals

pcd.estimate_normals()
o3d.visualization.draw_geometries([pcd], point_show_normal=True)
pcd.orient_normals_consistent_tangent_plane(100)
o3d.visualization.draw_geometries([pcd], point_show_normal=True)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

7.Open3D教程——表面重建 的相关文章

  • VTK三维重建面绘制算法之MC表面重建

    面绘制 面绘制算法是基于表面实现的一种三维重建算法 该类算法实现的响应速度快 xff0c 对于一些实时的交互操作中不存在卡顿问题 xff0c 在日常使用中有助于提高处理效率 xff0c 但该算法在细节特征上的重建效果是不如体绘制方法 基于算
  • 【python】使用open3d进行mesh sampling

    span class token keyword import span open3d span class token keyword as span o3d mesh path span class token operator 61
  • 两个点云相加合并(附open3d python代码)

    把多个点云合并的需求经常出现 xff0c 直接可把它们合并起来 coding utf 8 import open3d as o3d import numpy as np 加载点云 print 34 gt 正在加载点云 34 pcd1 61
  • open3D

    目录 一 说明 二 如何安装open3d xff1f 三 显示点云数据 3 1 显示点云场景数据 3 2 体素下采样 3 3 顶点法线估计 一 说明 对于点云 处理 xff0c 这里介绍哦pen3d xff0c 该软件和opencv同样是i
  • 基于Open3D的点云处理12-体素化

    体素化Voxelization 体素 voxel 是像素 pixel 体积 volume 和元素 element 的组合词 相当于3D空间中的像素 体素化是通过用空间均匀大小的体素网格 voxel grid 来模拟模型或者点云的几何形态的过
  • Open3d读写ply点云文件

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 地址为 https blog csdn net suiyingy article details 124017716 1 Open3d 安
  • open3d 点到点云之间的距离

    关键代码 dists pcd compute point cloud distance target chair pcd chair PointCloud import open3d as o3d import numpy as np if
  • 机智的Open3D学习生活(第一集):入坑前的准备工作

    1 Open3D的开源项目地址 https github com isl org Open3D 2 Open3D的官网地址 http www open3d org 3 Open3D的文档地址 http www open3d org docs
  • 点云梯度下采样

    点云下采样又称点云精简 均匀网格下采样 均匀网格下采样法是建立在空间包围盒精简算法之上对散乱点云快速简化的一种算法 其基本思想为 根据点云数据的密度确定最小三维网格 体素 的边长为 a b c a b c a b c 计
  • open3d 点云染色

    调用open3d颜色渲染函数 为点云染色 并将结果保存到pcd文件 include
  • Open3d读写pcd点云文件

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 地址为 https blog csdn net suiyingy article details 124017716 1 Open3d 安
  • Open3d学习计划——4(网格)

    Open3d学习计划 4 网格 欢迎大家关注 点云PCL 公众号 进入群聊一起学习 open3d有一种被称为TriangleMesh的3d三角网格的数据结构 下面的代码展示了如何从一个ply文件读取三角网格数据并且打印它的顶点和三角形 pr
  • 基于Open3D的点云处理5-点云之间的距离计算

    计算在一片点云中的每一个点在另一片点云中最近点的距离 常规写法 通过k d Tree进行搜索每个点的最近点 k idx dist k dTree search knn vector 3d pc2 points i k 通过k d Tree进
  • 三维点云质心与三角化 — python open3d

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 地址为 https blog csdn net suiyingy article details 124017716 1 质心介绍 质心概
  • 两种点云分割(一)— RANSAC分割平面

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 地址为 https blog csdn net suiyingy article details 124017716 点云分割的目的是将点
  • 点云旋转平移(二)—python open3d点云平移

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 地址为 https blog csdn net suiyingy article details 124017716 点云旋转平移介绍 请
  • 【3D人脸】Open3D学习笔记 一

    最近头疼于点云法向量的计算 实在找不到python的相关资料 想起来Open3D这个专门的工具 一搜还真有 踩了很多坑 记录一下 Open3D官方文档 http www open3d org docs release index html
  • 八种点云聚类方法(一)— DBSCAN

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 地址为 https blog csdn net suiyingy article details 124017716 传统机器学习聚类的方
  • 实时向点云添加新点 - Open3D

    我正在使用 Open3D 在 Python 中可视化点云 本质上 我想做的是以编程方式向点云添加另一个点 然后实时渲染它 这是我到目前为止所拥有的 我找不到任何解决方案 在下面的代码中 我展示了一种可能的解决方案 但它并不有效 第一个窗口关
  • 2d 图像点和 3d 网格之间的交点

    Given 网格 源相机 我有内在和外在参数 图像坐标 2d Output 3D 点 是从相机中心发出的光线穿过图像平面上的 2d 点与网格的交点 我试图找到网格上的 3d 点 This is the process From Multip

随机推荐

  • redis服务搭建,C++实现redis客户端,redis远程可视化工具

    目录 redis简介redis服务搭建redis常用命令C 43 43 实现redis客户端redis远程可视化工具 Another Redis DeskTop Manager redis简介 官方网址 xff1a https redis
  • Dijkstra算法图解,C++实现Dijkstra算法

    目录 Dijkstra算法简介数据结构抽象初始化开始计算第一轮计算第二轮计算第三轮计算第四轮计算算法总结 C 43 43 实现Dijkstra算法 Dijkstra算法简介 Dijkstra算法计算是从一个顶点到其余各顶点的最短路径算法 x
  • python实现ID3决策树分类算法

    所有的分类与回归算法中心思想大致是一样的 xff0c 那就是根据现有带标签的数据集训练一个分类器模型 xff0c 然后对待未知的样本 xff0c 根据训练好的分类模型来判定它属于哪个类 分类与回归的区别在我看来就是标签连续与否的区别 xff
  • Multiclass SVM(多类别SVM分类)关于其 loss function 的求导

    这两天学习cs231n的课程 xff0c 顺便做一做该课程配套的作业 在assignment1中有遇到用multiclass SVM来对cifar10进行分类的问题 其中 xff0c 为了进行训练 xff0c 需要计算loss 和相关梯度
  • 解决Ubuntu14.04 下不显示wifi的情况

    本人电脑安装完Ubuntu14 04后 xff0c 发现只能连接有线网 xff0c 而在右上角的网络下拉菜单中找不到wifi 网上的大多数教程大概为以下两类 xff1a 一类是 sudo apt get update sudo apt ge
  • Ubuntu系统下连接SJTU的校园wifi

    本人目前系统是Ubuntu 16 04 xff0c 但是14 04下按照这个方法也能成功连接上 xff08 亲测有效 xff09 如下方法应该能解决linux系统无法连接SJTU校园网的问题 首先 xff0c 点击连接SJTU wifi x
  • VS 代码对齐、折叠以及其他常用快捷键整理

    VS 代码对齐 折叠以及其他常用快捷键整理 Ctrl 43 M 43 O 折叠所有方法 Ctrl 43 M 43 M 折叠或者展开当前方法 Ctrl 43 M 43 L 展开所有方法 Ctrl 43 K xff0c Ctrl 43 D 61
  • Postman使用详解

    一 Postman背景介绍 用户在开发或者调试网络程序或者是网页B S模式的程序的时候是需要一些方法来跟踪网页请求的 xff0c 用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具 今天给大家介绍的这款网页调试工具不仅可以
  • 玩转51单片机 (一):Keil4中多文件项目中全局变量、头文件和源文件

    首先 xff0c 工程文件夹下有src inc 和 project三个文件夹 xff0c 分别存放源文件 头文件和工程文件 然后 xff0c 将所有源文件 头文件都添加到项目里面 xff0c 并将头文件目录添加到魔术棒下C51选项 的 In
  • Vins-Fusion工控机运行Debug

    一 问题记录 在自己的笔记本上运行Vins Fusion效果OK xff0c 但在工控机上运行出现静止状态轨迹飘飞 xff0c 笔记本上和工控机上都是ubantu 18 04系统 xff0c 摄像头硬件均为ZED2i xff0c 配置文件相
  • xavier安装torch-gpu

    1 查看xavier安装的jetpack版本 xff1a sudo apt show nvidia jetpack 一般情况下都是462的 2 查看cuda版本 xff1a cat usr local cuda version txt 3
  • 保存图像(cv::imwrite)

    保存图像文件道指定目录路径 只有8位 xff0c 16位的PNG xff0c JPG xff0c Tiffy文件格式而且时单通道或者三通道的BGR的图像才通过这种方式保存 保存PNG格式的时候可以保存透明通道的图片 可以指定压缩参数 inc
  • 解决 ssh: Could not resolve hostname \342\200\223t: Name or service not known

    问题 xff1a 在配置github时输入以下内容时报错 xff1a ssh T git 64 github span class token punctuation span com 方法 xff1a 将上述内容换为以下内容 ssh sp
  • python实现随机森林

    定义 xff1a 随机森林指的是利用多棵决策树对样本进行训练并预测的一种分类器 可回归可分类 所以随机森林是基于多颗决策树的一种集成学习算法 xff0c 常见的决策树算法主要有以下几种 xff1a 1 ID3 xff1a 使用信息增益g D
  • 从Github上下载文件的方法汇总

    前言 对于程序猿来说 xff0c Github简直就是个宝藏 xff0c 里面有世界各地大神的代码 xff0c 可以放心安全高效的食用 xff0c 本文整理了Github文件的一些下载方法 xff0c 仅供参考 1 通过git命令行 特点
  • fatal error: Python.h: No such file or directory #include “Python.h“

    在TX2上安装h5py时 xff0c pypi org没有对应的轮子 xff0c 需要自己用源码安装 xff0c 源码中涉及到C语言 xff0c 所以需要编译 xff0c 然而在编译的过程中报错 fatal error span class
  • 基于Python的ZED2教程 0.ZED2介绍

    本文主要介绍了ZED2的基本简介和硬件配置 基本简介 ZED2双目深度传感立体相机是位于美国旧金山Stereo labs公司制作的一款产品 xff0c 其与Kinect相机等流行的深度图像原理不同 xff0c 该深度相机的深度计算是通过双目
  • 基于Python的ZED2教程 1.打开ZED2

    本教程简单的对ZED相机进行了配置和打开 xff0c 然后打印出ZED 相机的串口号 xff0c 接着关闭相机 准备工作 由于ZED SDK在GPU上运算 xff0c 因此需要先在 nvidia com下载最新版的Cuda 然后 xff0c
  • 2.Open3D教程——文件读取和保存

    文件读取和保存 本教程演示了Open3D如何读写基本数据结构 1 点云 下面的代码读取和写入点云 span class token keyword print span span class token punctuation span s
  • 7.Open3D教程——表面重建

    在许多情况下 xff0c 我们希望生成密集的三维几何体 xff0c 即三角形网格 然而 xff0c 从多视点立体方法 xff0c 或深度传感器 xff0c 我们只能获得一个非结构化的点云 为了从非结构化输入中得到三角形网格 xff0c 我们