三维点云中常用的表面重建算法

浅谈点云与三维重建 阅读详情
AI摘要

本文探讨了点云表面重建算法的起源和发展,重点介绍了凸包、Alpha形状构建、BallPivoting滚球算法、PoissonSurfaceReconstruction和VoxelGrid等常用表面重建方法的原理及应用场景,涵盖文物保护、医疗影像、机器人导航和计算机动画等领域。

表面重建算法起源于计算机视觉和计算几何学领域。早期的研究集中在从二维图像中提取三维信息。然而,随着三维扫描技术的进步,越来越多的研究转向了如何从点云数据中重建表面。三维点云表面重建技术的发展,始于20世纪90年代,主要推动力是激光扫描和结构光扫描的广泛应用。

图片

Result of 3D reconstruction with inputs from drone video footage. Figure from Neuralangelo paper (Li et.al. 2023),IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2023
凸包Convex Hull

图片

ConvexHull3D:https://mathworld.wolfram.com/ConvexHull.html

在了解点云表面重建算法前,我们需要知道什么是凸包。凸包是包含所有点的最小凸多边形或多面体,而表面重建则是从点云数据中重建出原始物体的表面。并且凸包是包覆这群点的所有外壳当中,表面积和体积最小的一个外壳,而最小的外壳一定是凸的。虽然凸包是最简单的表面重建形式,适用于点云分布在物体外表面的情况,但对于复杂几何形状需要更复杂的表面重建算法,如Delaunay三角剖分、Poisson表面重建等。这些方法能够处理具有凹陷或洞的物体,通过插值和拟合技术生成满足一定平滑性和几何特征的表面。

凸包(Convex Hull)背后的主要思想来自凸多边形的定义。提醒一下,凸多边形是所有内角都小于 180° 的多边形。通过这个定义,我们发现每个正多边形都是凸的。如果一个角度大于 180°,则该多边形被认为是凹的。凸包使用与凸多边形应用于点集相同的原理。例如,凸包是包含集合中所有点的最小凸多边形。

凸包的目的之一是修剪平面上的特定区域。它主用于计算机图形学、几何和导航。Jarvis March是查找凸包的最流行和最简单的算法之一。它的简单的原理是探索一个集合中的 n 个点并返回围绕该集合的点的列表,这些点具有凸包的属性。这种方法在较好的情况下需要 O(nm) 的时间复杂度,其中 n 是探索的点数,m 是形成凸包形状的点数。在最坏的情况下,即 n = m,时间复杂度变为 O(n^2)。对于大数据集来说,这很容易变得非常大。要使用 Gift Warping 算法计算一组点的凸包,我们从已知位于凸包中的最左边的点 (对于 i = 0)开始。然后,我们选择另一个点 ,例如所有剩余的点都在点 和 之间绘制的线的右侧,然后我们循环重复,直到到达第一个点 。

图片

Jarvis March:https://alphasldiallo.github.io/convex-hull-delaunay-triangulation-and-alpha-shapes/

常用的表面重建方法

表面重建算法的数学原理通常涉及几何和拓扑学。以下是常用的表面重建方法:

Alpha形状构建

图片

给定一组任意分布的数据点,有许多方法可以将它们组织成三角形网格。但并非所有可能的三角形网格都能很好地表示点之间的空间关系。右边的图像是 Delaunay 三角剖分的示例。除了美观之外,Delaunay 还具有许多有利的特性,这些特性由 Boris Delaunay 于 1934 年和其他研究人员证明。https://gwlucastrig.github.io/TinfourDocs/DelaunayIntro/index.html

通过Delaunay三角剖分,我们可以找到一组点的Alpha形状。具体实现方法如下:

  1. 计算点集的Delaunay三角剖分。

  2. 删除至少有一条边的长度超过的所有三角形。

  3. 保留剩余的三角形作为Alpha形状的一部分。

Alpha Shapes算法基于Delaunay三角剖分,它通过一个参数来控制形状的细节程度。

若足够小则包含点对的圆不会包含其他点则是一个边

这种强大的方法用于概括包含一组点的边界多边形。下图中作者根据收集的运动轨迹生成了楼层平面图。如下图所示,与凸包不同,alpha 形状可以更精确地找到一组点的准确轮廓。该算法主要用于计算几何,尤其是在处理 3D 形状时。

图片

用凸包和 alpha 形状构建平面图的图示

import open3d as o3d
from copy import deepcopy

if __name__ == '__main__':
    file_path = 'rabbit.pcd'
    pcd = o3d.io.read_point_cloud(file_path)
    pcd = pcd.uniform_down_sample(50)  # 每50个点采样一次
    pcd.paint_uniform_color([0.5, 0.5, 0.5])  # 指定显示为灰色
    print(pcd)

    pcd1 = deepcopy(pcd)
    pcd1.translate((20, 0, 0))  # 整体进行x轴方向平移20
    mesh1 = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd1, alpha=2)
    mesh1.paint_uniform_color([1.0, 0.6667, 0.0039])  # 指定颜色
    print(mesh1)

    o3d.visualization.draw_geometries([pcd, mesh1],  # 点云列表
                                      window_name="Alpha Shape 重建",
                                      point_show_normal=False,
                                      width=800,  # 窗口宽度
                                      height=600,
                                      mesh_show_wireframe=True,
                                      mesh_show_back_face=True,
                                      )  # 窗口高度

图片

Ball Pivoting滚球算法

Ball Pivoting算法通过在点云上滚动一个球来构建表面。该算法依赖于球的半径,在滚动过程中连接球接触的点。

球半径确定了表面的细节和连接

import open3d as o3d
from copy import deepcopy

if __name__ == '__main__':
    file_path = 'rabbit.pcd'
    pcd = o3d.io.read_point_cloud(file_path)
    pcd = pcd.uniform_down_sample(50)  # 每50个点采样一次
    pcd.paint_uniform_color([0.5, 0.5, 0.5])  # 指定显示为灰色
    print(pcd)

    pcd2 = deepcopy(pcd)
    pcd2.translate((-20, 0, 0))  # 整体进行x轴方向平移-20
    radius = 0.01  # 搜索半径
    max_nn = 10  # 邻域内用于估算法线的最大点数
    pcd2.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius, max_nn))
    radii = [1, 2]  # 半径列表
    mesh2 = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(pcd2, o3d.utility.DoubleVector(radii))
    mesh2.paint_uniform_color([0, 0, 1])

    o3d.visualization.draw_geometries([pcd, mesh2],  # 点云列表
                                      window_name="Ball Pivoting 重建",
                                      point_show_normal=False,
                                      width=800,  # 窗口宽度
                                      height=600,
                                      mesh_show_wireframe=True,
                                      mesh_show_back_face=True,
                                      )  # 窗口高度

图片

Poisson Surface Reconstruction

Poisson Surface Reconstruction算法通过解Poisson方程,从点云中重建表面。它将点云视为一个连续的标量场,利用梯度场的散度来重建表面。

其中, 是向量场, 是散度。

import open3d as o3d
import numpy as np
from copy import deepcopy

if __name__ == '__main__':
    file_path = 'rabbit.pcd'
    pcd = o3d.io.read_point_cloud(file_path)
    pcd = pcd.uniform_down_sample(50)  # 每50个点采样一次
    pcd.paint_uniform_color([0.5, 0.5, 0.5])  # 指定显示为灰色
    print(pcd)

    pcd3 = deepcopy(pcd)
    pcd3.translate((0, 20, 0))  # 整体进行y轴方向平移20
    radius = 0.01  # 搜索半径
    max_nn = 10  # 邻域内用于估算法线的最大点数
    pcd3.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius, max_nn))
    mesh3, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd3, depth=9)
    vertices_to_remove = densities < np.quantile(densities, 0.35)
    mesh3.remove_vertices_by_mask(vertices_to_remove)
    mesh3.paint_uniform_color([1, 0, 0])

    o3d.visualization.draw_geometries([pcd, mesh3],  # 点云列表
                                      window_name="Poisson 重建",
                                      point_show_normal=False,
                                      width=800,  # 窗口宽度
                                      height=600,
                                      mesh_show_wireframe=True,
                                      mesh_show_back_face=True,
                                      )  # 窗口高度

图片

Voxel Grid

Voxel Grid方法通过将点云划分为规则的三维网格(体素),并在每个体素中估计表面法线和曲率来重建表面。

体素尺寸决定了重建的分辨率

import open3d as o3d
from copy import deepcopy

if __name__ == '__main__':
    file_path = 'rabbit.pcd'
    pcd = o3d.io.read_point_cloud(file_path)
    pcd = pcd.uniform_down_sample(50)  # 每50个点采样一次
    pcd.paint_uniform_color([0.5, 0.5, 0.5])  # 指定显示为灰色
    print(pcd)

    pcd4 = deepcopy(pcd)
    pcd4.translate((0, -20, 0))  # 整体进行y轴方向平移-20
    pcd4.paint_uniform_color([0, 1, 1])
    mesh4 = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd4, voxel_size=1)

    o3d.visualization.draw_geometries([pcd, mesh4],  # 点云列表
                                      window_name="Voxel Grid 重建",
                                      point_show_normal=False,
                                      width=800,  # 窗口宽度
                                      height=600,
                                      mesh_show_wireframe=True,
                                      mesh_show_back_face=True,
                                      )  # 窗口高度

图片

上述代码使用Alpha Shapes、Ball Pivoting、Poisson Surface Reconstruction和Voxel Grid等方法重建了点云的表面。

应用领域和场景

三维点云表面重建算法广泛应用于多个领域:

  1. 文物保护:用于数字化和重建文物表面,方便研究和展示。

  2. 医疗影像:在CT和MRI图像中重建人体器官的三维模型,辅助诊断和手术规划。

  3. 机器人导航:帮助机器人理解环境的三维结构,实现自主导航。

  4. 计算机动画:在电影和游戏中创建逼真的三维模型和场景。

三维点云表面重建算法在多个领域有广泛的应用和重要性。了解这些算法的原理和应用场景,不仅能帮助我们更好地使用这些技术,还能激发我们在更多领域的创新和探索。

以上内容总结自网络,如有帮助欢迎关注与转发,我们下次再见!

点云三维重建算法 点云三维重建算法 点云三维重建流程 (1)点云数据的获取 3D信息采集常使用移动测绘系统(Mobile Mapping System),MMS包括移动激光扫描系统和数码相机。移动激光扫描系统主要由激光扫描仪和惯性导航系统组成,用于测量点的三维坐标和激光反射强度;数码相机用于测量点的三维坐标和颜色信息。根据移动激光扫描系统和数码相机采集的数据可以得到点云数据,包括三维坐标、激光反射强度、颜色信息。 (2)预处理 由于激光扫描获取的数据中常常伴有杂点或噪声,影响了后续的处理,因此为了获取完整的模型,需要对点云 阅读详情

相关推荐

三维点云重建:Alpha Shape算法原理与MATLAB实战指南

三维点云重建是计算机视觉和图形学中的核心技术,旨在从离散的三维空间点集恢复出连续的三维模型表面。其核心原理在于通过算法推断点云之间的拓扑连接关系,从而构建出可用的三维网格。从技术价值看,三维重建为机器人导航、工业检测、文物数字化等领域提供了关键的三维环境感知能力。在应用场景上,泊松重建、滚球法和Alpha Shape等主流算法各有侧重,其中Alpha Shape以其直观的几何原理和良好的特征保持特性,成为学习表面重建的经典起点。本文以Alpha Shape为例,深入解析其基于“空球”判定的表面重建机制,并通

weixin_31102231的博客 329

(12)点云数据处理学习——表面重建

dd

chencaw的专栏 8378

点云曲面重建流程

pCr​p)wpq)ES∑q​wpqq−Sp2]​​​​​​χM​∇χM​F~Δχ​∇⋅Vχ​χ​0.5zdf⋅b​On2)On∗logn)On∗logn)On。

拿起键盘就撸 822

点云重建总结

几何处理:是一种计算的方法研究世界中的物理对象,通过硬件扫描生成物理对象的三维模型然后做各种处理和分析。三维视觉:传统的3D视觉是指从图像中恢复底层的三维结构。

Yisnow.的博客 5324

CVPR2020:点云弱监督三维语义分割的多路径区域挖掘

CVPR2020:点云弱监督三维语义分割的多路径区域挖掘 Multi-Path Region Mining for Weakly Supervised 3D Semantic Segmentation on Point Clouds 论文地址: https://openaccess.thecvf.com/content_CVPR_2020/papers/Wei_Multi-Path_Region_Mining_for_Weakly_Supervised_3D_Semantic_Segmentation_on

吴建明wujianming_110117 6070

PCL——B样条曲线曲面拟合

B样条曲线 样条曲线,是B-样条基函数的线性组合,是贝塞尔曲线的一般化。 给定n+1个控制点,P0,P1, …, Pn以及一个节点向量U = { u0,u1, …, um }, p 次B-样条曲线由这些控制点和节点向量U 定义,设Ni,p(u)是第i个 p次B-样条基函数,则p 次B-样条曲线的公式为 设P0、P02、P2是一条抛物线上顺序三个不同的点。过P0和P2点的两切线交于P1点,在P02点的切线交P0P1和P2P1于P01和P11 引入比值为参数t则 将前两个式子代入到第三个式子得到: 二

ZHANzhenrong的博客 1万+

【基础学习笔记】点云表面重建算法

本文研究了基于深度学习的大规模点云表面重建算法。首先介绍了点云的基本概念、存储格式和相关算法库,分析了点云质量问题。重点探讨了两类传统重建方法:基于隐式函数(如SDF、TSDF、MLS)和基于德劳内三角化的算法。针对现有深度学习方法存在的可扩展性差、细节丢失和训练数据依赖等问题,提出了创新的解决方案:一是开发了可扩展的深度学习重建算法,首次解决了算法扩展性问题;二是提出了基于深度学习的德劳内三角化重建算法。研究通过结合深度学习与传统几何方法,显著提升了大规模点云重建的性能和质量。

2301_81317184的博客 1169

基于Open3D的点云处理11-三维点云表面重建

三维表面建模

zfjBIT的专栏 3301

三维重建精度革命:COLMAP如何通过多视图立体视觉技术突破毫米级建模瓶颈

在数字化浪潮席卷工业制造、文化遗产保护和虚拟现实领域的今天,三维重建技术已成为连接物理世界与数字世界的关键桥梁。然而,传统三维建模方法面临着**精度不足、效率低下、成本高昂**三大核心挑战。COLMAP(Structure-from-Motion and Multi-View Stereo)作为开源三维重建领域的领军工具,通过创新的多视图立体视觉(MVS)算法架构,成功实现了从普通数码照片到工业级

gitblog_00318的博客 568

点云重建与法向量计算

点云重建是指从离散的三维点云数据中生成连续的三维模型的过程。而计算点云的法向量则是点云处理中的另一个关键步骤,它能够提供有关点云表面的几何信息,用于表面重建、形状分析和物体识别等任务。综上所述,点云重建和法向量计算是点云处理中的两个重要任务。点云重建的方法有很多种,其中一种常用的方法是基于三角化的重建方法。计算点云的法向量是点云处理中的一个重要步骤,它可以揭示点云表面的几何结构信息。在本文中,我们将探讨一种常用的方法来进行点云重建和计算法向量的技术。函数读取点云数据,点云数据通常以PLY或XYZ格式存储。

YadxFix的博客 265

【2026最新版】PCL点云处理算法汇总(C++长期更新版)

PCL学习目录。博客长期更新,最近一次更新时间为:2026年10月4日。

点云侠的博客 63万+

3D点云--表面重建算法详解(Surface Reconstruction)

给定点云算法分类类型代表算法输出形式适用场景基于三角化三角形网格均匀稠密点云基于隐式函数隐式场 + 等值面噪声/孔洞数据基于深度生成参数化网格缺失区域补全。

weixin_45590420的博客 2989

simulink调用C代码函数-C Caller模块

simulink中如何调用写好的C代码函数?使用C Caller模块调用C代码。

weixin_40531919的博客 5668

点云重建方法汇总一(PCL-CGAL)

点云重建方法比较(PCL与CGAL)

阁楼 1万+

dpdk 源码分析 rte_ring

rte_ring源码分析

qq_40843445的博客 929

【图数据库与知识图谱入门】2.2 图数据库 vs. 关系型数据库 vs. NoSQL数据库

本文对比了关系型数据库、NoSQL数据库和图数据库的核心差异与应用场景。关系型数据库以二维表结构为核心,适合结构化数据的事务处理(如MySQL),但多表关联查询性能随层级增加而下降。NoSQL数据库(如MongoDB)具有灵活schema,适合海量非结构化数据存储,但关联查询能力较弱。图数据库专注于节点-边关系建模,擅长处理复杂关联分析(如社交网络)。通过学生-课程案例展示了MySQL的多表JOIN操作和MongoDB的两种关联实现方式(内嵌文档和文档引用),揭示了不同数据库在数据关联处理上的本质区别。

kngines 1538

三维重建(单目、双目、多目、点云、SFM、SLAM)

三维重建(单目、双目、多目、点云、SFM、SLAM)

ZhengrongYue的博客 9万+

【视频讲解】Python量子计算聚类Q-means:量子k-means算法分析电路数据实现可视化...

全文链接:https://tecdat.cn/?p=37821分析师:Yifan Zhang量子计算在近期已然成为一个频繁出现的热门概念。尽管它在大众认知以及互联网社区中备受瞩目,热度极高,然而就其实际能力而言,当前仍然存在诸多局限(点击文末“阅读原文”获取完整代码数据)。量子计算作为一个全新的领域,带来了相较于传统经典计算模式的重大范式转变。在量子计算的体系中,传统的 0 或 1 的经典比特被一...

拓端研究室TRL 1455

PCL学习之点云重建

离散点云• 数据量大• 渲染显示大• 模型操作计算不方便网格模型• 数据量小• 渲染方便• 模型操作计算方便。

出门吃三碗饭的博客 2503

海康工业相机 Could not find module MvCameraControl.dll(已解决)

【代码】海康摄像机 Could not find module MvCameraControl.dll(已解决)

hmbbpdx的博客 2220

11.3 海岛微电网与工业园区的构网应用

海岛微电网与工业园区配电网是构网技术下沉应用的两大典型场景。海岛微电网以构网型储能为核心,解决孤岛系统稳定性问题,需具备黑启动、多能源协调和故障穿越能力;工业园区则侧重电能质量治理、并离网无缝切换和经济优化运行。两类场景均需解决多机并联稳定性、故障特性适配和分层协同控制等关键技术。构网型变流器的电压源构建能力、自适应控制策略及飞轮储能等特殊应用,为构建高可靠性、高经济性的分布式能源系统提供了创新解决方案。

技术工作者 1081

【点云surface】Poisson表面重建

Poisson表面重建算法是一种用于从点云数据生成平滑曲面模型的算法。它基于Michael Kazhdan等人在2006年发表的论文《Poisson surface reconstruction》。该算法通过将点云数据转换为体素表示,并利用Poisson方程来重建曲面。该算法的基本原理是将点云数据转换为体素表示,然后通过求解Poisson方程来重建曲面。Poisson方程是一个偏微分方程,它描述了一个函数的Laplace算子(二阶导数)与该函数的散度之间的关系。

weixin_45824067的博客 1960

YOLOv8/v9 遥感图像目标检测实战指南:建筑物检测与变化监测

遥感图像在城市规划、灾害评估、农业监管等领域应用广泛,但传统目标检测方法存在效率低、精度不足、难以适配遥感图像大尺寸、多尺度目标等问题。本文以“建筑物检测与变化监测”为核心,基于DOTA、NWPU VHR-10等公开数据集,系统讲解YOLOv8/v9在遥感图像中的实战流程。从数据获取、格式转换、模型训练优化,到大图切片推理、建筑物变化监测,全程提供可复现的代码与参数配置。通过针对性优化(旋转增强、切片推理等),模型在NWPU VHR-10数据集上mAP50达0.85以上,可适配卫星影像、无人机航拍等多场景

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 519

14、三维表面重建-DeepSDF

DeepSDF

小白的博客 5351

Python 爬虫实战:深入同花顺,抓取股票行情数据,助力投资决策

通过本次 Python 爬虫实战,我们成功地从同花顺抓取了股票行情数据,并进行了存储、处理、分析和可视化展示。在这个过程中,我们不仅掌握了爬虫技术的基本应用,还学会了如何对动态加载的数据进行处理和分析。然而,本次爬虫任务也存在一些局限性,例如仅爬取了部分股票的数据,且未对股票的历史行情进行深入分析。在未来的工作中,我们可以进一步优化爬虫程序,爬取更多股票的数据,并深入分析股票的历史行情走势、技术指标等,为投资者提供更有价值的数据支持。

u014481728的博客 5332

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

点云地图三维表面重建

通过对点云进行表面三角化mesh重建,可以使得点云地图更加轻量化,同时针对地面(红色)和非地面(蓝色)使用不同采样率的三角面片顶点,可以进一步减少地图数据量。

三维点云技术探索 976

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: KMeans等其他聚类算法
下一篇: 点云中ICP算法的详解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值