CGAL的泊松曲面重构

1、介绍

        该CGAL组件实现了一种曲面重建方法,该方法将具有定向法线的点集作为输入,并计算隐式函数。我们假设输入点不包含异常值和少量噪声。通过使用CGAL曲面网格生成器[4]或可能使用任何其他曲面轮廓算法提取该函数的等值面来生成输出曲面网格。

        更具体地说,核心表面重建算法包括计算隐函数,该隐函数是推断实体的近似指示函数(泊松表面重建-称为泊松)。泊松是一个两步过程:它需要在函数求值之前求解隐函数。 

        本章提供了一个关于表面重建的详细教程,并提供了选择最合适的方法以及预处理和后处理的指南。

2、流程改造

        从点集重建曲面通常是一个连续的过程,包括以下步骤:1)扫描和扫描对齐生成一组点或具有法线的点;2) 异常值去除;3) 简化以减少输入点的数量;4) 平滑以减少输入数据中的噪声;5) 当采集设备尚未提供法线时的法线估计和定向;以及6)表面重建。
        CGAL为上面列出的除对齐以外的所有步骤提供算法。

        第二章点集处理描述了在重建前对点集进行预处理的算法,其中包括简化、异常值去除、平滑、法线估计和法线定向等功能。

3、泊松

        给定一组在3D固体边界上采样的具有方向性的法线(在此之后称为定向点)的3D点,Poisson表面重建方法解决了对于推断的固体的近似指示函数的问题,其梯度最好匹配输入的法线。输出的标量函数以自适应八叉树表示,然后使用自适应游走立方体进行等值轮廓。

        CGAL实现了一种此算法的变体,它在一组3D定向点上构建3D Delaunay三角剖分,并通过Delaunay细化来改进它,从而消除所有非各向同性的四面体并细分为输入定向点的松散边界框。在细化期间添加的Steiner点的法线被设置为零。然后,它作为剖分上的分段线性函数求解指示函数的标量。更具体地说,它在三角剖分的每个顶点上解决Poisson方程 Δf=div(n) 使用稀疏线性求解器。最后,CGAL表面网格生成器提取等值曲面,其函数值默认设置为所有输入点处的f的中值。

4、重构函数

        提供了一个全局函数 poisson_surface_reconstruction_delaunay()。它以具有法线的点作为输入,处理整个重建管道:它计算隐函数;它使用基于Delaunay细分的CGAL表面网格生成器以给定的精度重建表面;它以多边形网格的形式输出结果。

        此函数旨在为泊松重建提供一个快速且用户友好的API。高级用户可能对使用该类(请参阅重建类)感兴趣,该类允许他们使用其他曲面网格或不同的输出结构。

5、重构类

        类模板声明是template<class Gt>class Poisson_rebuildion_function,其中Gt是几何特征类。

        有关详细信息,请参阅:Poisson_rebuildion_function<GeomTraits>

5.1、轮廓

        通过使用CGAL曲面网格生成器,可以将计算的隐函数等值线化以重建曲面:make_surface_mesh()

        参数Tag会影响make_surface_mesh()的行为:

        Manifold_tag:输出网格保证为无边界的流形曲面。

        Manifold_with_boundary_tag:输出网格保证是流形,可能有边界。

        Non_manifold_tag:输出网格没有保证,因此作为多边形汤输出。

5.2、输出

        make_surface_mesh() 重建的表面需要是 SurfaceMeshComplex_2InTriangulation_3 概念的模型,这是一种数据结构,用于表示嵌入到三维三角剖分中的二维复杂体。

        SurfaceMeshComplex_2InTriangulation_3定义了遍历重建表面并将其转换为三角形汤的方法。

        其他CGAL组件提供将重建的表面网格写入对象文件格式(OFF)并将其转换为多面体(当它是流形时)的功能:output_surface_facets_to_off();output_surface_facets_to_polyhedron()

6、指导

        表面重建问题本质上是不适定的,因此所提出的算法并不假装重建具有任意采样条件的各种表面。本节为用户提供了一些关于理想采样和轮廓条件的提示,并描述了当这些条件不匹配时的一些失败案例。

6.1、理想条件

        用户必须记住,泊松曲面重建算法包括两个阶段(从输入点集计算隐函数和绘制该函数的等值面轮廓)。两者都需要在采样条件和参数调整方面给予一定的注意。

6.2、点集

        理想情况下,泊松表面重建方法的当前实现期望密集的3D定向点集,并在闭合、光滑的表面上采样。这里的“定向”是指所有3D点必须具有指向推断曲面的一致定向法线。下图说明了满足这些理想条件的情况。

         泊松重建。左图:雕像上采样的120K点(美能达激光扫描仪)。右图:重建的曲面网格。

        左图:雕像上采样的120K点(美能达激光扫描仪)。右图:重建的曲面网格。 

        该算法对各向异性采样和噪声具有相当的鲁棒性。它还通过填充相应的孔对缺失数据具有鲁棒性,因为该算法旨在重建推断实体的指示函数

        左上角:手上采样的65K点(Kreon激光扫描仪)。左下:由于扫描技术,点集具有高度各向异性。右图:重建的曲面网格和特写。这些孔已适当闭合。 

        该算法通常对异常值不具有鲁棒性,尽管少数异常值并不总是会导致故障,

        左图:在象上采样的70K点,很少有异常值用磁盘强调。右图:重建的曲面网格。

         即使当推断的曲面由几个连接的组件组成时,该算法也能很好地工作,前提是所有法线都得到了正确的估计和定向(当前的CGAL法线定向器算法在某些情况下可能会失败,请参见mst_orient_normals()),并且最终的轮廓绘制算法对每个组件都进行了正确的播种。当推断的曲面由几个嵌套的连接组件组成时,应注意交替(向内/向外)定向每个组件的法线,以便最终的轮廓绘制阶段选择适当的轮廓绘制值。

6.3、轮廓参数

        我们的泊松曲面重建算法的实现计算了一个隐函数,该隐函数表示为3D Delaunay三角剖分的四面体上的分段线性函数,该三角剖分由输入点构建,然后通过Delaunay精化进行精化。因此,任何等参曲面也是分段线性的,因此可能包含尖锐的折痕。由于轮廓算法make_surface_mesh()期望平滑的隐式函数,当设置较小的网格大小或曲面近似误差参数时,这些尖锐的折痕可能会在最终重建的曲面网格中创建虚假的顶点簇(见下图)。

        避免这些虚假聚类的一种方法是调整网格大小和表面近似参数,使其与平均采样密度(通过compute_average_spacing()获得)相比足够大,以便轮廓算法感知平滑的等参表面。我们建议使用以下轮廓参数:

        最大三角形半径:至少为平均间距的100倍。

        近似距离:至少为平均间距的0.25倍。

         左图:用近似距离=0.25*平均间距重建的曲面。右图:用近似距离=0.15*平均间距重建的曲面。注意脸颊上的假簇。

6.4、退化条件

        上面列出的条件是相当严格的,在实践中并不是所有条件都能在申请中得到满足。我们现在说明了在采样、法线方向错误、噪声和尖锐折痕等条件不满足时算法的行为。

6.5、稀疏采样

        重建算法期望一个足够密集的点集。尽管由于算法的变分性质,在某些密度条件下没有正式的证据证明其正确性,但我们的实验表明,当局部间距至多为局部特征大小的十分之一(到中轴的距离,它完全捕捉曲率、厚度和分离度)时,该算法能很好地重建所有薄特征。当不满足此条件时,重建不会重建薄的欠采样特征.

        左图:海王星三叉戟上的50万个采样点。在这种情况下,重建(未示出)是成功的。右图:点集简化为1K个点,然后重建(所有输入点都用法线表示)。不重建薄特征。

6.6、大孔

        重构被设计为求解隐函数,该隐函数是推断实体的近似指示函数。因此,轮廓算法总是提取一个闭合的表面网格,因此能够填充由于采集过程中的遮挡等原因而丢失数据的小孔

        左图:一只手上采样的65K个点,腕基处没有捕捉到数据。右图:重建的曲面网格。表面在手指上适当闭合,在手腕上也闭合,但方式不太合理。 

        在大孔的情况下,该算法仍然将它们全部闭合,但由于用于求解的3D Delaunay三角剖分在孔被填充的地方非常粗糙,因此所得到的分段线性隐式函数可能表现出大的三角形补丁和尖锐的折痕。这可以通过两次通过的方法来避免。点子集的第一步用于获得孔处曲面的近似值。然后,该曲面用于计算具有完整点集的第二遍的更平滑的3D Delaunay三角测量。

Left: The wrist. Middle: one pass. Right: two passes.

6.7、错误的法线方向

        泊松曲面重建方法求解梯度与一组输入法线最匹配的隐式函数。因为它在最小二乘法的意义上解决了这个问题,所以它对少数孤立的方向错误(翻转)的法线是稳健的。然而,一组方向错误的法线会导致不正确的隐函数,从而导致虚假的几何失真甚至拓扑失真。

        左图:在具有方向错误法线簇的球体上采样的点。右图:重建的曲面网格带有虚假凸起。 

6.8、噪声和异常值

        大量的噪声不可避免地会影响重建(见下图顶部),并且当前的实现没有提供任何用数据拟合来换取平滑度的方法。然而,如果信噪比足够高和/或为绘制等参表面轮廓而设置的表面近似和尺寸参数相对于噪声水平较大,则输出表面网格将看起来平滑(未示出)。如果用户想要生成平滑而详细的输出曲面网格,我们建议通过jet_smooth_point_set()应用平滑。

        左上角:在球体上采样并被大量噪声破坏的点。右上角:重建的曲面网格。左下:平滑的点集。右下角:重建的曲面网格。

        对于大量的异常值,故障情况(未显示)转化为虚假的小连接部件和推断表面附近的巨大失真。在这种情况下,必须通过remove_outliers()删除异常值。

6.9、尖锐的折痕

        当前的重建算法不能恢复推断表面中存在的尖锐折痕和角。这转化为平滑的尖锐折痕。

        左图:在具有尖锐特征(折痕、飞镖和角)的机械零件上采样的5K点。右图:具有平滑折痕的重建曲面网格。

7、性能

        我们提供了一些扫描数据的性能数字。我们测量泊松隐函数的计算时间、一系列近似距离的轮廓绘制时间、内存占用以及点集简化的影响。

7.1、泊松隐函数

        为确定泊松隐函数基准而选择的点集是Bimba con Nastrino点集(160万点)。我们测量该点集以及通过随机简化获得的简化版本的泊松隐式函数计算(即,对Poisson_reformation_function::compute_implicit_function()的调用,在下文中用泊松解表示)。下表提供了越来越多点的泊松求解计算时间(以秒为单位)。

Number of points (x1000)

Poisson solve duration (in s)
6015
10025
25096
500150
1,000249
1,800478

7.2、轮廓

        为确定轮廓阶段的基准而选择的点集是简化为100k点的Bimba con Nastrino点集。我们测量一系列近似距离的轮廓绘制(即调用make_surface_mesh())持续时间和重建误差。重建误差表示为从输入点到重建表面的平均距离,单位为毫米(Bimba con Nastrino雕像高324毫米)。

Approx. distance (*average spacing)Contouring duration (in s)Reconstruction error (mm)
0.119.20.055
0.256.90.106
0.53.20.18
11.650.36
20.80.76

         简化为100k点的Bimba con Nastrino点集的轮廓持续时间(以s为单位)和重建误差(mm)与几个近似距离参数的关系。

7.3、内存

        我们测量了重建完整Bimba con Nastrino点集(180万点)以及简化版本的内存占用率。

        当使用稀疏线性求解器求解泊松线性系统时,泊松隐函数计算具有记忆峰值。

Number of points (x1000)Memory occupancy (MBytes)
60180
100270
250790
5001300
1,0002200
1,8003800

7.4、点集简化

        由于上述内存限制,我们建议简化激光扫描仪捕获的点集。

        我们测量了Bimba con Nastrino点集(1.6M个点)以及简化版本的重建误差。所有重建都使用推荐的轮廓参数近似距离=0.25*输入点集的平均间距。重建误差表示为从输入点到重建表面的平均距离,单位为毫米(Bimba con Nastrino雕像高324毫米)。

Number of points (x1000)Reconstruction error (mm)
600.27
1200.15
2500.11
5000.079
1,0000.066
1,5000.061
1,6000.06

 

        具有1.6M个点的Bimba con Nastrino点集以及简化版本的重建误差(mm)相对于点的数量。 

CGAL 5.6 - Poisson Surface Reconstruction: User Manual

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

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

相关文章

如何在业务中体现 TCC 事务模型?

在分布式系统设计中,随着微服务的流行,通常一个业务操作被拆分为多个子任务,比如电商系统的下单和支付操作,就涉及到了创建和更新订单、扣减账户余额、扣减库存、发送物流消息等,那么在复杂业务开发中,如何…

VSCode 创建工作区,多文件夹终端切换

VSCode 创建工作区的好处有以下几点: 项目结构清晰:每个工作区都有自己的文件夹结构,可以更好地组织和管理项目文件。版本控制:VSCode 支持多种版本控制系统,如Git,可以在工作区内进行代码的版本管理。插件…

Linux驱动开发学习笔记2《LED驱动开发试验》

目录 一、Linux下LED灯驱动原理 1.地址映射 二、硬件原理图分析 三、实验程序编写 1.LED 灯驱动程序编写 2.编写测试APP 四、运行测试 1.编译驱动程序和测试APP (1)编译驱动程序 (2)编译测试APP 2.运行测试 一、Linux下…

探究Spring Boot 中实现跨域的几种方式

文章目录 前言1. 使用CrossOrigin注解2. 使用WebMvcConfigurer配置3. 使用Filter配置4. 使用全局配置结束语 前言 在现代Web应用中,由于安全性和隐私的考虑,浏览器限制了从一个域向另一个域发起的跨域HTTP请求。解决这个问题的一种常见方式是实现跨域资…

编程实战:类C语法的编译型脚本解释器(九)编译语句

系列入口:编程实战:类C语法的编译型脚本解释器(系列)-CSDN博客 前文已经介绍了编译入口,核心就是语句,本文介绍语句的编译。 目录 一、代码概览 二、辅助函数 2.1 tokens.IsPosNotToken(pos) 2.2 toke…

【华为OD题库-074】VLAN资源池-Java

题目 VLAN是一种对局域网设备进行逻辑划分的技术,为了标识不同的VLAN,引入VLAN ID(1-4094之间的整数)的概念。定义一个VLAN ID的资源池(下称VLAN资源池),资源池中连续的VLAN用开始VLAN-结束VLAN表示,不连续的用单个整数表示&#…

第4节:Vue3 布尔属性

使用v-bind指令将布尔属性绑定到元素上。以下是一个简单的实例&#xff1a; <template><view class"container"><text v-bind:is"isActive">{{ message }}</text><button click"toggleActive">切换激活状态</…

LT8668SXC DP转VBO/HDMI2.1/EDP 最高可支持到8k60hz

DP1.4a/eDP1.4b Receiver ▪ Compliant with DisplayPort specification 1.4a for 1.62Gbps, 2.7Gbps, 5.4Gbps and 8.1Gbps ▪ Compliant with Embedded DisplayPort specification version 1.4b ▪ Support DisplayPort 1/2/4 lanes ▪ Support HDCP 1.3/2.3 ▪ …

JVM 执行引擎篇

机器码、指令、汇编语言 机器码 各种用二进制编码方式表示的指令&#xff0c;叫做机器指令码。开始&#xff0c;人们就用它采编写程序&#xff0c;这就是机器语言。机器语言虽然能够被计算机理解和接受&#xff0c;但和人们的语言差别太大&#xff0c;不易被人们理解和记忆&a…

【SA8295P 源码分析 (四)】137 - 车载以太网协议学习总结(待更新......)

【SA8295P 源码分析】137 - 车载以太网协议学习总结 一、Ethernet 以太网介绍1.1 实效性:AVB(Audio Video Bridging)/ TSN(Time-Sensitive Networking)1.1.1 Synchronization:同步,协议(802.1AS)1.1.2 Latency:低延迟,协议(802.1Qav、802.1Qbu、802.1Qbv、802.1ch、…

Go语言中的接口设计艺术:发现面向对象编程的无限可能

一、GoLang 中的接口 1、GoLang 中的接口 在 Go 语言中接口&#xff08;interface&#xff09;是一种类型&#xff0c;一种抽象的类型接口&#xff08;interface&#xff09;定义了一个对象的行为规范&#xff0c;只定义规范不实现&#xff0c;由具体的对象来实现规范的细节实…

德迅抗D盾是如何防护攻击的

德迅抗D盾是针对游戏行业面对的DDoS、CC攻击推出的针对性的网络安全解决方案&#xff0c;相比高防IP&#xff0c;除了能针对大型DDoS攻击&#xff08;T级别&#xff09;进行有效防御外&#xff0c;还具备彻底解决游戏行业特有的TCP协议的CC攻击问题能力&#xff0c;防护成本更低…

基于Java SSM框架实现超市管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现超市管理系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#…

哈希查找(数据结构实训)

题目&#xff1a; 哈希查找 标准输入输出 题目描述&#xff1a; 实现哈希查找。要求根据给定的哈希函数进行存储&#xff0c;并查找相应元素的存储位置。本题目使用的哈希函数为除留取余法&#xff0c;即H(key)key%m&#xff0c;其中m为存储空间&#xff0c;冲突处理方法采用开…

Android的文件切割和合并,补全wav文件头

示例&#xff1a; 1、普通文件的拆分与合并&#xff1a; private void testFile() {File mWavFile new File(getExternalFilesDir(null).getAbsolutePath() "/test.wav");if (!mWavFile.exists()){Log.d("caowj", "文件不存在&#xff1a;" …

多人聊天作业

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

如何评估数据资产的价值?哪种方法更容易实现?

今年可以称之为数据年&#xff0c;从去年年底党中央发布《数据20条》&#xff0c;对数据领域的一系列的制度建设做了提纲起领的作用。在财经领域今年的下半年&#xff0c;密集出台一系列跟数据资产相关的政策&#xff0c;包括8月21日发布的《企业数据资源会计处理的暂行规定》以…

最小生成树算法与二分图算法

文章目录 概述 P r i m Prim Prim 算法 - 稠密图 - O ( n 2 ) O(n^2) O(n2)思路概述时间复杂度分析AcWing 858. Prim算法求最小生成树CODE K r u s k a l Kruskal Kruskal 算法 - 稀疏图 - O ( m l o g m ) O(mlogm) O(mlogm)思路解析时间复杂度分析AcWing 859. Kruskal算法求…

后端返回数据前端保留两位小数

一.背景 在平时工作中尤其是银行金融类佘涉及到数据计算问题&#xff0c;数据统计又不能显示太多小数点&#xff0c;很多时候需求不一样&#xff0c;对数据的精度要求也不一样&#xff0c;下面是我在工作中用到的方法总结记录一下。 二.不同需求对应的方法 toFixed() 方法 to…

探索HarmonyOS_开发软件安装

随着华为推出HarmonyOS NEXT 宣布将要全面启用鸿蒙原声应用&#xff0c;不在兼容安卓应用&#xff0c; 现在开始探索鸿蒙原生应用的开发。 HarmonyOS应用开发官网 - 华为HarmonyOS打造全场景新服务 鸿蒙官网 开发软件肯定要从这里下载 第一个为微软系统(windows)&#xff0c;第…