CloudCompare——泊松重建

在这里插入图片描述

本文由CSDN点云侠原创,CloudCompare——泊松重建,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。

1、泊松重建算法

  泊松重建是Kazhdan M在2006年提出的基于八叉树和泊松方程的一种网格三维重建算法。其本质是一种隐函数表面重建算法,在空间中用一个表面来区分内外,直观理解为表面外、表面内。用0、1来表示内外表面,可以简单理解为若某一元素属于这个集合则为1,即表面内,若某一元素不属于这个集合则为0,即表面外。这个关系就是Kazhdan M提出的指示函数,利用指示函数,可以对空间内部的所有有效指示函数实现梯度计算,通过求解这个函数提取等值面,得到表面的过程,即构建泊松方程并对其求解的过程。
  在论述泊松重建之前,首先对算法内用到的八叉树进行了研究。八叉树是指,若树非空,那么树中任意节点的子节点要么为0个要么为8个,是用来表示三维空间的树状数据结构。任意一个立方体可以最少被分为八个等分的小立方体,用八叉树的每个节点可以表示每个小立方体,这八个字节点合起来就是其父节点表。如图1所示:
在这里插入图片描述

图1 八叉树对空间区域的划分

  将场景点云数据利用八叉树划分空间区域,将每个点放到正方形的空间里,设定某一阈值,如果该正方形内的数据点超过这个阈值,就将该正方体再次划分,直到每个小正方体包含的点数小于或等于这个阙值,每个小正方体就是一个叶节点,记其最大深度为D,用以存储目标物体的点云数据。
  以八叉树的结构存储实验获取的点云数据,极大地方便了算法在实现过程中数据的存储及检索。

2、泊松重建核心思想及原理

(1)核心思想
  泊松重建的核心思想为:将物体区分为几何体内部和几何体外部,物体点云数据的法向量可以标示内部和外部,通过隐式地拟合该物体的指示函数,得到该物体表面的估计,即通过将物体表面的离散的点的信息转化到连续的表面函数上,从而构建出表面。
  设某一物体为 M M M,该物体的表面为 δ M \delta M δM,其指数函数 χ M \chi_M χM为:
χ M ( x ) = { 0 , x ∉ M 1 , ∈ M (1) \chi_M(x)= \begin{cases} 0,\quad x\notin M\\ 1, \in M \end{cases} \tag{1} χM(x)={0,x/M1,M(1)
其中点云法向量与 χ M \chi_M χM的关系如图2所示:
在这里插入图片描述

图2 泊松重建的基本函数关系

  指数函数 χ M \chi_M χM为分段函数,表示 q 0 q_0 q0在表面内其值为1,在表面外的点其值为0。显然,若得到每一个点 q 0 q_0 q0 χ M ( q 0 ) \chi_M(q_0) χM(q0),即可知道整个物体的表面。
  如果直接插值得到 χ M ( q 0 ) \chi_M(q_0) χM(q0)显然是不可能的,因为 χ M \chi_M χM不具有连续性,直接插值得到0到1之间的没有意义,因此不能使用该算法。可以先用平滑滤波函数平滑指数函数。
(2)法向量到梯度空间
  首先,先用平滑函数 F ˉ \bar{F} Fˉ来平滑 χ M \chi_M χM,对于任意点 p ∈ δ M p\in\delta M pδM,定义 N ⃗ δ M ( p ) \vec{N}_{\delta M}(p) N δM(p)为指向内侧的表面法向量,规定 F ( q ) F(q) F(q)为平滑滤波器, F ( q − p ) F(q-p) F(qp)表示 F F F沿 p p p方向的位移,因为指示函数 χ M \chi_M χM不好求导,可以利用 χ M ∗ F ˉ \chi_M*\bar{F} χMFˉ两个函数的卷积的倒数近似求解 χ M \chi_M χM,即:
Δ ( χ M ∗ F ˉ ) ( q 0 ) = Δ ∣ q = q 0 ∫ M F ˉ ( q − p ) d p = ∫ δ M F ˉ ( q 0 − p ) N ⃗ δ M ( p ) d p (2) \Delta(\chi_M*\bar{F})(q_0)=\Delta|_{q=q_0}\int_M\bar{F}(q-p)dp=\int_{\delta M}\bar{F}(q_0-p)\vec{N}_{\delta M}(p)dp\tag{2} Δ(χMFˉ)(q0)=Δq=q0MFˉ(qp)dp=δMFˉ(q0p)N δM(p)dp(2)
其中,*为卷积,此处为平滑滤波。这样就完成了从点云数据法向量到梯度空间的求解。
(3)梯度空间到向量场
  由于物体表面点的离散性, N ⃗ \vec{N} N 对于表面每个点 q q q未必都是已知的,即 N ⃗ δ M ( p ) \vec{N}_{\delta M}(p) N δM(p)的分布是未知的,可以利用分段近似解决这个问题,通过观察 P = ( p i , n i ) P=(p_i,n_i) P=(pi,ni)来近似。
  初始离散样本点集记为 S S S s s s S S S中的一个点 ( s ∈ S ) (s\in S) (sS) s s s包含位置信息 ( s . p ) (s.p) (s.p)和法向量信息 ( s . N ⃗ ) (s.\vec{N}) (s.N )。将 δ M \delta M δM按照空间划分成不同表面区域 δ s \delta s δs,并且 s ∈ S s\in S sS δ s ⊂ δ M \delta s\subset\delta M δsδM。式(2)可以转化为积分求和,其中每个小的积分可以近似为常函数,可以用 s . p s.p s.p对应的函数和 δ s \delta s δs的面积的积分代替,如下式:
Δ ( χ M ∗ F ˉ ) ( q 0 ) = ∑ s ∈ S ∫ δ s F ˉ N ⃗ δ M ( p ) d p ≈ ∑ s ∈ S ∣ δ s ∣ F ˉ ( q − s . p ) s . N ⃗ = V ⃗ ( q ) (3) \Delta(\chi_M*\bar{F})(q_0)=\sum_{s\in S}\int_{\delta s}\bar{F}\vec{N}_{\delta M}(p)dp\approx \sum_{s\in S}|\delta s|\bar{F}(q-s.p)s.\vec{N}=\vec{V}(q) \tag{3} Δ(χMFˉ)(q0)=sSδsFˉN δM(p)dpsSδsFˉ(qs.p)s.N =V (q)(3)
  假设样本点是均匀分布的,那么 ∣ δ s ∣ |\delta s| δs即为常数可以省略,通过离散近似,由式(3) 即可得到向量空间 V ⃗ \vec{V} V
(4)转化为泊松方程
  向量空间 V ⃗ \vec{V} V 和指数函数 χ M \chi_M χM满足下式,即为最终需要求解的问题:
Δ χ ⃗ = V ⃗ (4) \Delta \vec{\chi}=\vec{V}\tag{4} Δχ =V (4)
其中如果直接求解 χ ⃗ \vec{\chi} χ 需要求解积分,向量空间 V ⃗ \vec{V} V 不一定是无旋场,通常意义上不能积分,将式(4)两边进行求导运算,得到式(5):
Δ χ ⃗ = Δ ⋅ V ⃗ = Δ ⋅ Δ χ (5) \Delta \vec{\chi}=\Delta\cdot\vec{V}=\Delta\cdot\Delta {\chi}\tag{5} Δχ =ΔV =ΔΔχ(5)
  其中, Δ \Delta Δ为拉普拉斯算子, Δ ⋅ \Delta\cdot Δ为散度算子,上式为泊松方程, χ ⃗ \vec{\chi} χ 是要求解的函数,上式意思是梯度的散度等于向量场的散度。方程的解可以用拉普拉斯方程基本解与函数卷积求出,即可找到指示函数。

3、泊松算法流程

  泊松重建的输入是带有法向量的点云数据,在上一章节中已经完成了对点云数据法向量的求解,算法输出的是三角网格模型,其算法流程如下图所示:
在这里插入图片描述

图3 泊松重建流程

  1. 构建八叉树 g g g,存储点云数据,八叉树节点深度记为D,每一个节点 o ∈ g o∈g og;
  2. 设置函数空间 F F F为: F ( x , y , z ) = ( B ( x ) B ( y ) B ( z ) ) ∗ n F(x, y,z)=(B(x)B(y)B(z))^{*n} F(x,y,z)=(B(x)B(y)B(z))n,其中 ∗ n *n n表示 n n n次卷积,所有的节点 o o o均有对应的空间函数 F F F

4、软件实现

  qPoissonRecon是“Poisson Surface Reconstruction”的缩写,它是由约翰霍普金斯大学的Misha Kazhdan47提出的三角形网格生成算法的简单接口。CloudCompare软件中的这个功能与作者维护和共享的PoissonRecon48库的实现完全相同(目前使用的版本:6.11)。CloudCompare只是添加了一个对话框来设置一些参数(见下文),并将其无缝集成到自己的工作流中。
在这里插入图片描述

注意

  1. 要使用这个插件,用户必须选择一个有法线的点云
    2.为了获得好的结果,点云的法线必须是干净的(即,所有法线的方向必须是正确的/一致的,并且不要有太多的噪声)
  2. 默认情况下,该算法应该应用于封闭的3D形状,但是也可以在一个不封闭的网格中,使用输出的“密度”信息来获得一个有效的网格。

  插件对话框如下:
在这里插入图片描述

  参数比较清晰,可以在原始库页面上找到它们的精确定义。主要参数是'octree depth',越深(即越大),结果就越好,但也需要更多的运行时间和内存。
下面是一个输出网格的例子(网格在左边,输入点云-带法线-在右边):
在这里插入图片描述

5、利用输出密度

  当处理开放形状(如激光雷达点云等)时,最有趣的功能是由PoissonRecon输出的'density’测量。你可以使用这个标量字段来减少输出的网格区段,以便与输入的云区段最佳匹配:

  • 一旦计算完成,关闭插件对话框
  • 选择输出网格
  • 向下滚动它的属性(查看“属性”对话框-默认在左边),直到你看到“SF显示参数”部分
    在这里插入图片描述
      你可以使用左边的白色圆形交互器(对应于“最小显示值”)以交互方式隐藏顶点具有最低密度值的三角形。它们对应的是距离输入点云最远的三角形。
    一旦你在视觉上满意了结果,你可以导出可见的三角形作为一个新的网格:
  • 使用 ‘Edit > Scalar fields > Filter by Value’ 功能
  • 最小值和最大值应该已经设置为您交互式设置的值
  • 确认创建一个新的网格
  • 你可以在输出网格上(使用Edit > scalar Fields > Delete)删除’density’标量字段
    在这里插入图片描述
    完整操作:
    1.生成模型
    在这里插入图片描述
    2.根据密度裁剪模型
    在这里插入图片描述

6、相关代码

  • 12
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值