CGAL的多边形曲面重建

1、介绍

        该软件包实现了一种基于假设和选择的方法,用于从点云重建分段平面对象。该方法将从分段平面对象采样的无序点集作为输入。输出是对输入点集进行插值的紧凑且不透水的曲面网格。该方法假设提供了所有必要的主平面(或者可以使用在形状检测中描述的形状检测方法或任何其他替代方法从输入点集中提取)。

        CGAL中现有的表面重建方法(即泊松表面重建、推进前表面重建和尺度空间表面重建)适用于表示由光滑表面描述的对象的点集。对于建筑物等人造物体,由于重建模型的缺陷和复杂性(即巨大的网格、缺失的区域、噪声和不期望的结构),结果并不令人满意。这主要是因为这些方法倾向于密切关注表面细节。该软件包中引入的算法旨在生成简化且不透水的曲面网格。它可以恢复物体的尖锐特征,并且可以处理大量的噪声和异常值,补充了其他表面重建方法。

        需要混合整数规划(MIP)求解器来解决由该方法制定的约束优化问题。

2、算法

        与传统的分段平面对象重建方法不同,这些方法要么侧重于提取良好的几何基元,要么侧重于获得基元的适当排列,而该方法的重点在于将基元(即平面)相交,并寻求基元的适当组合,以获得流形和不透水多边形表面模型。

        该方法将表面重建视为基于假设和选择策略的二元标记问题。重建包括以下步骤:

        从输入点集中提取平面(如果已知平面或通过其他方式提供,则可以跳过);

        通过将提取的平面基元相交来生成一组候选面;

        通过在硬约束下进行优化来选择候选面部的最优子集,该硬约束强制最终的多边形表面在拓扑上正确。

        (a) 输入点集;(b) 提取的平面片段;(c) 通过成对相交生成的候选面;(d) 通过优化选择的面;(e) 重建模型。

2.1、Energy 

        给定由两两交集产生的N个候选面F={fi|1≤i≤N},通过优化来选择最好地描述物体几何并形成流形和不透水的多边形表面的候选面的最优子集。

        设X={xi|1≤i≤N}表示面的选择(即,如果xi=1,则fi被选择;如果xi=0,则不被选择),目标函数由三个能量项组成:数据拟合、模型复杂性和点覆盖。

        数据拟合。该术语旨在评估面与点云的拟合质量。它的定义是测量对最终重建没有贡献的点的置信加权百分比。

         |P|是P中的总点数。support(fi)是支持点的数量,占适当概念的置信度。

        模型复杂性。该术语旨在鼓励简单的结构(即大平面区域)。它被定义为模型中锐利边缘的比率。 

         |E|表示候选面集合中成对交叉点的总数。 corner(ei)是一个指示函数,其值由ei连接的两个选定面部的配置决定。如果与ei关联的面部在最终模型中引入了尖锐的边缘,则corner(ei)的值为1。否则,corner(ei)的值为零,表示两个面部共面。

        点覆盖。这个术语旨在处理缺失数据。其思想是使最终模型中不受支持的区域(即点未覆盖的区域)尽可能小。该术语被定义为模型中未覆盖区域的比率。

         其中,area(M)、area(fi)和area(Mαi)分别表示最终模型、候选面fi和fi的α-形状网格Mαi的表面积。 area(Mαi)用于近似3D点覆盖的面积。

2.2、面选择

        通过上述能量项,可以在某些硬约束下通过最小化这些项的加权和来获得最优面集合。

        其中∑j∈N(ei)xj表示由边ei连接的面数。该值强制为0或2,这意味着可以选择一个或两个面。这些硬约束保证最终模型的每条边只连接两个相邻的面。 

        两个平面相互交叉,形成四个部分(a)。(b) 至(g)示出了所有可能的组合以确保2倍曲面。(b)和(c)中的边连接两个共面部分,而在(d)到(g)中,它在最终模型中引入了尖锐的边。

3、示例

3.1、点云重构

        该方法假设可以从输入点集中提取所有必要的平面。以下示例首先从输入点云中提取平面,然后重建曲面模型。

3.2、使用用户提供的平面进行重建

3.3、模型复杂性控制

        除了通过鼓励大的平面区域来有利于干净和紧凑的重建结果之外,模型复杂性项还提供了对模型细节的控制,即,增加该项的影响导致重建的3D模型中更少的细节。

        模型复杂性项的影响。通过逐步增加重构模型复杂度项的影响。每个子图下的值是相应优化中使用的权重。

4、性能

4.1、问题的复杂性

        该方法旨在重建具有合理几何复杂度的单个对象。当前的实现方式计算平面段的成对交点,这对于确保拓扑精确的重建是足够的,但不是必要的。在大型复杂对象上运行可能会导致大量的候选面,从而需要解决一个巨大的整数编程问题。

        具有中等复杂度的单个对象的重建时间通常在几秒钟内。在这三个步骤中,当候选面的数量很大(例如,超过5000个)时,面选择步骤主导重建管道。

4.2、数值解算器

        当前实现包含两个开源解算器:GLPK和SCIP。需要注意的是,GLPK只能解决小问题,即结构相当简单的对象。如果您正在重建更复杂的对象,您可能需要考虑更高效的开源解算器(例如CBC),甚至商业解算器,例如Gurobi、CPLEX。下表大致介绍了一些解算器的性能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用玻璃材质制作3D钻石模型

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…

MySQL 8 update语句更新数据表里边的数据

数据重新补充 这里使用alter table Bookbought.bookuser add userage INT after userphone;为用户表bookuser在userphone列后边添加一个类型为INT的新列userage。 使用alter table Bookbought.bookuser add sex varchar(6) after userage ;为用户表bookuser在userage 列后边添…

Hibernate 框架 (2023年架构师下半年案例分析题)

Hibernate 是一种对象和关系之间映射的框架,是 Java 应用和关系数据库之间的桥梁。它可以将数据库资源映射为一个或者多个 POJO。将面向数据库资源的各种业务操作以 POLO 的属性和方法的形式实现,使人们摆脱烦琐的 JDBC 代码,将精力更多地集中…

C/C++,优化算法——双离子推销员问题(Bitonic Travelling Salesman Problem)的计算方法与源代码

1 文本格式 // C program for the above approach #include <bits/stdc.h> using namespace std; // Size of the array a[] const int mxN 1005; // Structure to store the x and // y coordinates of a point struct Coordinates { double x, y; } a[mxN]; //…

【Linux下基本指令 —— 2】

Linux下基本指令 —— 2 十.more 指令语法&#xff1a;功能&#xff1a;常用选项&#xff1a;举例&#xff1a;Xshell7展示十一.less 指令语法&#xff1a;功能&#xff1a;选项&#xff1a;Xshell7展示 十二.head 指令语法&#xff1a;功能&#xff1a;选项&#xff1a;Xshell…

智能优化算法应用:基于孔雀算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于孔雀算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于孔雀算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.孔雀算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

一. 初识数据结构和算法

数据结构与算法是一个达到高级程序员的敲门砖。当你脱离了语言的应用层面&#xff0c;去思考他的设计层面时&#xff0c;你就依旧已经开始初识数据结构与算法了 数据结构 什么是数据结构 对于数据结构的定义官方并没有统一的解释&#xff0c;在各个百科以及算法的书中&#xf…

Unity 自定义窗口

放在Editor文件夹下&#xff1b; #if UNITY_EDITORusing System; using UnityEditor; using UnityEngine;namespace EditorCustumTool {/// <summary>/// 自定义窗口/// </summary>public class CustomWindow : EditorWindow{public enum FlagType{Flag1 101,Fl…

基于stm32ESP8266控制并显示速度的小车

这篇博客是为了实现stm32与ESP8266通讯控制的小车&#xff0c;同时可以实现在网络助手和OLED显示屏上显示速度的功能。 一、硬件部分 名称图片功能32单片机--小车-oled显示屏显示当当前的速度&#xff0c;有需要了解如何使用的可以看看我的文章&#xff0c;http://t.csdnimg.…

MATLAB - 凸优化(Convex Optimization)

系列文章目录 前言 凸优化&#xff08;Convex optimization&#xff09;是在凸约束&#xff08;convex constraints&#xff09;条件下使凸目标函数&#xff08;convex objective function&#xff09;最小化的过程&#xff0c;或者等同于在凸约束条件下使凹目标函数最大化的过…

mybatis和mybatisplus中对 同namespace 中id重复处理逻辑源码解析

一、背景 同事在同一个mapper.xml &#xff08;namespace相同&#xff09;&#xff0c;复制了一个sql没有修改id&#xff0c;正常启动项目。但是我以前使用mybatis的时候如果在namespace相同情况下&#xff0c;id重复&#xff0c;项目会报错无法正常启动&#xff0c;后来看代码…

算法Day26 数位统计

数位统计 Description 给你一个整数n&#xff0c;统计并返回各位数字都不同的数字x的个数&#xff0c;其中0 ≤ x < 10^n。 Input 输入整数n 0≤n≤13 Output 输出整数个数 Sample 代码 import java.util.Scanner;public class Main {public static void main(String[] ar…

初识 pytest 及断言使用

章节目录&#xff1a; 一、pytest 相关概述二、环境搭建三、使用前提四、断言4.1 常用断言4.2 异常断言4.3 断言装饰器 五、结束语 一、pytest 相关概述 pytest 是一个基于 Python 编写的测试框架&#xff0c;用于编写和运行各种类型的软件测试。它提供了丰富的功能和灵活的语法…

CleanMyMac2024一款十分高效的mac系统清理工具

当很多人还在为电脑运行缓慢、工作问题不能快速得到解决而烦恼的时候&#xff0c;我已经使用过了多款系统清理工具&#xff0c;并找到了最适合我的那一款。我的电脑是超耐用的Mac book&#xff0c;接下来给大家介绍三种在众多苹果电脑清理软件的排名较高的软件。 一、Maintena…

JUnit 之初体验

文章目录 1.定义2.引入1&#xff09;使用 Maven 工具2&#xff09;使用 Gradle 工具3&#xff09;使用 Jar 包 2.样例0&#xff09;前提1&#xff09;测试类2&#xff09;测试方法3&#xff09;测试断言4&#xff09;实施 总结 1.定义 JUnit 是一个流行的 Java 单元测试框架&a…

NLP项目实战01之电影评论分类

介绍&#xff1a; 欢迎来到本篇文章&#xff01;在这里&#xff0c;我们将探讨一个常见而重要的自然语言处理任务——文本分类。具体而言&#xff0c;我们将关注情感分析任务&#xff0c;即通过分析电影评论的情感来判断评论是正面的、负面的。 展示&#xff1a; 训练展示如下…

【深度学习】一维数组的 K-Means 聚类算法理解

刚看了这个算法&#xff0c;理解如下&#xff0c;放在这里&#xff0c;备忘&#xff0c;如有错误的地方&#xff0c;请指出&#xff0c;谢谢 需要做聚类的数组我们称之为【源数组】 需要一个分组个数K变量来标记需要分多少个组&#xff0c;这个数组我们称之为【聚类中心数组】…

Kafka快速实战以及基本原理详解

文章目录 一、Kafka介绍为什么要用Kafka 二、Kafka快速上手实验环境单机服务体验 三、理解Kakfa的消息传递机制四、Kafka集群服务五、理解服务端的Topic、Partition和Broker七、Kafka集群的整体结构八、Kraft集群Kraft集群简介配置Kraft集群 一、Kafka介绍 ChatGPT对于Apache …

人体关键点检测1:人体姿势估计数据集

人体关键点检测1&#xff1a;人体姿势估计数据集 目录 人体关键点检测1&#xff1a;人体姿势估计数据集 1.人体姿态估计 2.人体姿势估计数据集 &#xff08;1&#xff09;COCO数据集 &#xff08;2&#xff09;MPII数据集 &#xff08;3&#xff09;Human3.6M &#xf…

CENTOS 7 添加黑名单禁止IP访问服务器

一、通过 firewall 添加单个黑名单 只需要把ip添加到 /etc/hosts.deny 文件即可&#xff0c;格式 sshd:$IP:deny vim /etc/hosts.deny# 禁止访问sshd:*.*.*.*:deny# 允许的访问sshd:.*.*.*:allowsshd:.*.*.*:allow 二、多次失败登录即封掉IP&#xff0c;防止暴力破解的脚本…