文章目录

  • 参考资料
  • 相关问题
  • 相关参数
  • 原理介绍
    • 1.基本概念
      • 1.1 顶点表示
      • 1.2 边表示
      • 1.3 数据结构
        • 1.3.1 元素
        • 1.3.2 存储方式
        • 1.3.3 查找方式
    • 2.算法实现
      • 2.1 查找种子点(Find Seed Triangle)
      • 2.2 球旋转(Ball Pivoting)
        • 2.2.1 旋转操作
        • 2.2.2 join和glue操作
        • 2.2.3 Out-of-Core extension
        • 2.2.4 多次传球(Multiple Passes)
  • Remarks

参考资料

[1] 原文
[2] 滚球法Github链接
[3] BPA PDF
[4] 文中提到的空洞填补论文(A Volumetric Method for BuildingComplex Modcls from Range Images)

相关问题

1.选择种子点(seed)时要确保三个顶点的法向相同(constitently oriented)
2.滚球法可改变半径并多次使用

相关参数

Lists: 数据点σi\sigma_iσi​、法向量nin_ini​
front: 已连接边缘链表(Linked Lists of edges)的集合,初始组成为单闭合回路(single loop)

ps: front使用链表保存的原因:球沿着边缘旋转时,front将改变其拓扑结构
两种情况:
(1)遇到新数据:使用拓扑运算符 joinjoinjoin

(2)遇到以前使用过的数据点,使用拓扑运算符glueglueglue
以上两个拓扑运算符能保证front在任意时刻都是链表结构

原理介绍

1.基本概念

1.1 顶点表示

每条边eije_{ij}eij​由两个端点(σi,σj)(\sigma_i,\sigma_j)(σi​,σj​)表示,相对顶点(opposite vertex)σo\sigma_oσo​,连接此三个顶点的球的中心为cijoc_{ijo}cijo​,半径为ρ\rhoρ

球旋转操作:

添加三角形的连接操作(去除边eije_{ij}eij​并添加两条新边eike_{ik}eik​、ekje_{kj}ekj​):

1.2 边表示

沿着front的同一个闭合回路连接前一条边(previous dege)和后一条边(next edge)
每条边有三种状态:

1.activeactiveactive:用于旋转

2.boundaryboundaryboundary:不能旋转的边

3.frozenfrozenfrozen

将所有信息与edge一起保存,可以使得旋转球的过程变得简单

1.3 数据结构

1.3.1 元素

ball_pivot和find_seed_triangleball\_pivot和find\_seed\_triangleball_pivot和find_seed_triangle这两个过程需要对包含在空间领域内的点子集进行有效查找,可以使用 立方体单元格(a regular grid of cubic cells)或者体素(Voxel) 进行实现

1.3.2 存储方式

数据点保存在桶排序(Bucket sort)的链表(Lists)中,每个体素形成一个“桶”,体素的尺寸为δ=2ρ\delta=2\rhoδ=2ρ,相同体素内的数据点形成连续的子列表(“桶”),每个体素存储一个指向其子链表开头的指针(如果体素内没有数据则指向下一个体素)

1.3.3 查找方式

给定点ppp,将它的坐标除以δ\deltaδ(体素尺寸即球直径)便可以很容易的查找它所属的体素(优化点1)
我们通常需要查找到点ppp距离2ρ2\rho2ρ(球直径即体素尺寸)以内的所有点,这些点都包含在与V相邻的27个体素中(包括V本身)

2.算法实现

2.1 查找种子点(Find Seed Triangle)

(1)选取没有被使用过的任意点σ\sigmaσ
(2)按到σ\sigmaσ的距离考虑其邻域内的点对(pairs)σa,σb\sigma_a,\sigma_bσa​,σb​
(3)创建潜在的种子三角形σ,σa,σb\sigma,\sigma_a,\sigma_bσ,σa​,σb​
(4)检查三角形法线与其顶点法线是否相同(如向外指向)
(5)检查中心在外半空间(猜测:利用法向判断方向)的半径为ρ\rhoρ的球是否接触三个顶点并且不包含其他数据点
(6)找到所有有效种子点时停止
一些问题:
(1)对于主表面附近的一些噪声点(如配准时产生的重影)容易形成一些小的潜在种子三角形,虽然很容易通过后滤波去除掉,但是会浪费大量的计算资源(优化点2)

噪声样本导致产生了两层数据:

(2)每个体素只考虑将其中一个点作为种子三角形的顶点,在体素区域内的表面(surface)法向用该体素内所有点的法向的均值表示
(3)当找到seed后就开始用Pivoting操作进行重建,当不能继续旋转时就在停止位置寻找新的种子点,跳过所有包含已组成三角形顶点的体素(体素中有一个点是已找到的三角形中的顶点),当无法再找到seed时,停止算法

2.2 球旋转(Ball Pivoting)

2.2.1 旋转操作

球旋转操作:

其中:

m:m:m:顶点σi、σj\sigma_i、\sigma_jσi​、σj​的中点
σi、σj:\sigma_i、\sigma_j:σi​、σj​:旋转edge的两个端点
σx:\sigma_x:σx​:待检测连接的点(以mmm为中心的2ρ2\rho2ρ邻域内的所有点)
cx:c_x:cx​:与σx、σi、σj\sigma_x、\sigma_i、\sigma_jσx​、σi​、σj​接触的圆球的中心

所有的cxc_xcx​都位于环形轨迹(circular trajectory)γ\gammaγ上,通过计算球ρ\rhoρ与圆γ\gammaγ的交点便可计算出在σx\sigma_xσx​处的圆中心点
记录下第一个接触(hit)到的点的坐标其对应的球中心
(可通过添加一些约束条件(Trivial rejection)以加速寻找第一个接触到的点)(优化点3)

2.2.2 join和glue操作

joinjoinjoin和glueglueglue操作:

沿着边eije_{ij}eij​旋转,触碰的点为σk\sigma_kσk​
情况一:σk\sigma_kσk​不是meshmeshmesh中的点
输出三角形(σk、σi、σj)(\sigma_k、\sigma_i、\sigma_j)(σk​、σi​、σj​)并移除边eije_{ij}eij​并添加两条新边eike_{ik}eik​、ekje_{kj}ekj​

情况二:σk\sigma_kσk​已经是meshmeshmesh中的点
(1)σk\sigma_kσk​是当前mesh内部的点
即当前mesh所有的边(edge)都没有包含顶点σk\sigma_kσk​(σk\sigma_kσk​不在当前mesh的边界(front)上)
边eije_{ij}eij​会被标记为boundaryboundaryboundary
(2)σk\sigma_kσk​是front(当前mesh边界edge)上的点
首先检查添加候选三角形不会造成非流形(nonmanifold)或不可定向流形(nonorientable manifold)
待查1:(检查可以通过检查连接(incident)到σk\sigma_kσk​的edge是否存在(existence)以及其方向(orientation)来确定)
随后即可执行join与gluejoin与gluejoin与glue操作

2.2.3 Out-of-Core extension

核心外扩展(Out-of-Core extension)可以采取阵面推进法(advancing-front method)
文章中使用了简单数据切片方案(simple data-slicing scheme)
基本思想:缓存当前用于旋转(Pivoting)的数据集的一部分来转储不再使用(no longer being used)的数据(即已经找到三角形的区域),加载需要的数据
(1)使用两个轴对齐(Axis-aligned)的平面π0\pi_0π0​与π1\pi_1π1​来定义用于旋转的活动工作区域
(2)初始化π0\pi_0π0​的条件:没有数据在该平面之下(below)
(3)π1\pi_1π1​:在π0\pi_0π0​之上(above)一定距离(用户指定distance)
(4)创建edge后,测试其端点是否高于(above)π1\pi_1π1​,是的话就将其标记为frozenfrozenfrozen
(5)当队列中所有的edge都被frozenfrozenfrozen后,向上抬升π0\pi_0π0​和π1\pi_1π1​,并将所有frozenfrozenfrozen的edgeedgeedge更新为activeactiveactive的edgeedgeedge
(6)当相应的边界框进入或退出活动切片(slice)时,将从内存加载或丢失对应的数据点子集(优化点4)

2.2.4 多次传球(Multiple Passes)

处理采样不均匀表面,可通过增加球半径进行多次传递的方法改善

Remarks

1.算法复杂度对于数据点数目上是线性的,并且是按照线性存储的
2.密度有界假设,此假设适用于扫描数据(scanned data),就算多次重复扫描,任意区域的点总数也是在已知的常量范围之内
3.算法大部分步骤都是复杂度为O(1)O(1)O(1)的操作(如更新到队列、链接链表等)
4.每次ball_pivotball\_pivotball_pivot操作都要在不同的meshedgemesh\ edgemesh edge上进行,所以旋转次数(复杂度)为O(n)O(n)O(n)
5.一次单独的pivotpivotpivot需要识别2ρ2\rho2ρ邻域内的所有点,可以将候选点周围27个体素内的作为需识别的点,因为密度有界,所以这些点总数会限定在常数BBB内
6.find_seed_trianglefind\_seed\_trianglefind_seed_triangle依次选取未被使用过的点,因为每个点最多被使用一次,因此此操作的复杂度也为O(n)O(n)O(n)
7.考虑待选seed是否被接受时,需要根据接触三个顶点的球对周围邻域内的所有点进行区分,因此复杂度为O(B3)O(B^3)O(B3)
8.BPA的空间复杂度为O(n+L)O(n+L)O(n+L),O(L)O(L)O(L)体素总数,O(n)O(n)O(n)是数据数目,可通过“切片”(阵面推进法)方法控制

滚球法(Ball Pivoting)三维表面重建论文笔记相关推荐

  1. 轮廓提取之滚球法、凹包算法

    提示:本文章主要介绍轮廓提取算法------滚球法的运用,可用于提取点云等二维.三维数据的轮廓,以及代码框架设计. 文章目录 前言 一.基于二维点数据的模型轮廓提取算法 1.1 适用场景 1.2 问题 ...

  2. 图形处理(十三)基于可变形模板的三维人脸重建-学习笔记

    基于可变形模板的三维人脸重建-学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50331423 作者:hjimce 一.数据库处理: 我们通 ...

  3. 14、三维表面重建-DeepSDF

    简介 传统的‎表面重建‎技术中,SDF是基于离散化体素对物体或者场景表面的一种表达,而现实中表面是连续的,DeepSDF是一种学习过的连续符号距离函数(SDF)表示一类形状,可以从部分和有噪声的3D输 ...

  4. 微软三维人脸重建论文总结——《Accurate 3D Face Reconstruction with Weakly-Supervised Learning》

    原作:https://arxiv.org/abs/1903.08527 研究机构:微软研究院 写在前面 想象一下,通过二维的人脸图片,生成高度还原的三维人脸模型.真是异想天开,可是人工智能要做的不就是 ...

  5. 15、三维表面重建-Occupancy Networks

    简介 随着深度神经网络的到来,基于学习的三维重建方法逐渐变得流行.但是和图像不同的是,在3D中没有规范的表示,既能高效地进行计算,又能有效地存储,同时还能表示任意拓扑的高分辨率几何图形.很多先进的基于 ...

  6. 30、三维表面重建-Convolutional Occupancy Network

    简介 论文:https://arxiv.org/pdf/2003.04618.pdf github:https://github.com/autonomousvision/convolutional_ ...

  7. CT图像的三维表面重建

    对于医学图像的处理,ITK是一个具有丰富资源的库,专门对医学图像进行分割和配准,里面有丰富的函数.ITK可以直接读取单张的CT图像或者是序列的CT图像,最近新版本的VTK也可以实现这一功能,但对于CT ...

  8. 三维场景重建整合笔记

    近年来,随着智能手机.头盔立体显示等技术的发展和 普及,虚拟现实技术取得了飞速发展.在 VR 技术中场景建 模是最关键的一步.3D 游戏通常采用专业三维建模软件, 如 Autodesk Maya.Au ...

  9. 2015-2020年各类国际会议与期刊基于图像的三维对象重建论文综述(7)——Datasets

    7. Datasets 下面是一些目前主流的用于训练和评估基于深度学习的三维重建算法性能的数据集. "IMG":图像. "obj":objects. " ...

最新文章

  1. 安全性神话已不再,首个MacOS勒索病毒现身
  2. c mssql mysql_mssql与mysql 数据迁移
  3. 软件工程实践2017第一次作业-051502125
  4. P4592 [TJOI2018]异或
  5. Mac Redis安装入门教程
  6. 23种设计模式(4)-生成器模式
  7. WinCE6.0下TCPMP的BenchMark汇总
  8. 虚假信息成物联网“毒瘤”
  9. 差距几何 Vista与XP系统性能对比测试(下)
  10. 狂野飙车8:极速凌云 for Mac v1.0.2 Asphalt 8 好玩的赛车游戏
  11. Python 爬取懂车帝详情页“全部车型模块信息”!懂车帝就火起来了吗?
  12. 编程珠玑番外篇之番外篇-O 中间语言和虚拟机漫谈(ZZ)
  13. 机器学习实战- 回归(Regression) 概述
  14. 【软件定义汽车】【其他篇】ASPICE--V模型软件开发
  15. java项目管理系统禅道下载,禅道专业版下载|禅道项目管理系统 V8.0 专业版 下载_当下软件园_软件下载...
  16. 除夕夜的电子微传单怎么轻松制作,求分享
  17. 《C++ Primer中文版》(第四版)信息汇总(三)
  18. webpackjsonp 还原_电催化CO2还原领域综述梳理,速来学习!
  19. 计算机怎么乘以百分数,excel怎么算乘法?excel表格中如何设置自动乘百分数
  20. python中的框架、库、包、模块都是什么意思_【扫盲】模块 库 框架 包

热门文章

  1. JavaScript中Map方法的详解
  2. 中考计算机试题ppt判断,2015中考信息技术试题PPT操作题2-26(终)
  3. 什么是MySQL数据库?应用环境有哪些?
  4. 基于微博评论的文本情感分析与关键词提取的实战案例~
  5. redux之compose的理解
  6. MySQL InnoDB Cluster部署
  7. 在linux服务器下配置代理服务器( 使用liunx服务器的ip用来代理 )
  8. 算法 - 两数互质问题
  9. C语言的函数定义和函数声明
  10. Ubuntu python3安装pandas【问题解决】