三维点云孔洞修复(附Python代码和公共点云数据集链接)

1.孔洞成因

(1)物体自身缺失
(2)物体自身形状复杂,很多凹凸面不够规则甚至存在空腔,空腔内部无法被三维激光扫描仪扫描到
(3)物体部分区域对激光扫描不敏感,未被扫描上
(4)扫描仪的扫描稳定性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.孔洞类型

按位置不同分为边缘孔洞和内部孔洞,边缘孔一般为非封闭孔洞,其孔边界也是模型边界的一部分;而内部孔为封闭孔洞。内部孔按形状不同又可分为普通孔洞、间隙孔洞以及环形岛屿孔洞,普通孔洞只有一条形状较规则的闭合边界;间隙孔洞形状狭窄且较长,多出现于模型倒角处;环形岛屿孔洞的缺失区域呈环状,内部包含孤立的岛屿面片。按面积大小分为大孔洞和小孔洞;按特征差异分类的孔洞,在整体模型面结构上孔洞分为平面孔洞、跨面孔洞、凸面孔洞以及凹面孔洞,区别在于所处特征区域不同。
在这里插入图片描述

3.孔洞识别方法

(1)基于三角网格化的孔洞识别顾名思义就是先将采集到的点云模型三角网格化,然后在三角网格结构中根据各个三角形面片中点线的拓扑关系进行孔洞识别。
(2)基于散乱点云的孔洞识别:在进行有效的孔洞边界识别时,由于散乱点云个体之间没有特定的连接关系且数据量巨大,通过建立点云数据空间索引遍历数据点,并根据孔洞边界点特征在空间中找到满足条件的特征点。
根据空间维度不同,基于点云数据的识别算法又可分为基于二维平面投影映射的识别和基于三维空间的识别。
基于二维平面投影映射的边界识别典型算法包括创建投影平面,计算投影点的角度标准阈值差,从而确定孔洞边界点对投影点进行参数化后,根据邻域点集在采样点处的场力大小之和可以表示点集的平均值,设置阈值,从而识别点云的边界特征点;其他还包括加权度量、吊锤法等判别边界特征点。
基于三维空间的边界识别算法则多考虑点云数据本身的三维特征,基于点云曲率、邻域点法向夹角等设置单一或混合阈值进行检测,该类算法对参数设置敏感度高。
此外,针对特定的点云数据,还有基于核回归等边界提取方法,该类算法不通过阈值参数提取孔洞边界,适用于特定的内部不规则尖锐孔洞的识别优化。
(3)基于K邻域搜索的孔洞识别:利用KD树建立散乱点云的空间拓扑关系后,采用距离判别法识别出点云模型中的孔洞,即计算采样点到其k个邻近点的欧氏距离,通过距离是否大于给定阈值来鉴定是否为边界点。

4.孔洞修复方法

1、基于几何的修复方法
基于传统几何的修复方法一般分为两种:①三角网格化点云修复的方法;②散乱点云模型修复的方法。
(1)三角网格化点云修复方法:该修复方法主要思想是将点云三角网格化,通过网格化的模型寻找到每个点之间的拓扑关系。通过网格中每条边拓扑属性寻找边界,若该边两侧都是三角形则该边为内部边;若该边一侧为三角形,另一侧为多边形,则为孔洞边界。那么连接成边界的两个点则为边界点。(该类算法在点云分布比较均匀和数据量较小时,能够获取较好的修补效果,但当点云数据量较大时,由于建立三角网格所需时间较多,难以取得理想的效果)
1)基于三角网格的孔洞修复主要分为基于体素的算法和基于表面的算法。
a.基于体素的修复算法首先将网格模型变换成由体素表示的模型,然后在离散空间中应用不同的方法进行孔洞修复,其采用的典型算法为有向体素融合,在此基础上根据孔洞邻域表面信息,使用多种偏微分方程进行聚敛优化等。
b.基于表面的典型算法则是在描述点云的拓扑结构后,根据特征线匹配、几何特征、形状计算和能量函数、径向基函数等进行孔洞修复。
总体来说,基于三角网格的修复对于一般的规则物体(如机械零件、动物点云模型)具有较好的修复效果,对不规则的大型点云模型或孔洞区域较大的网格模型修复效果不佳。
(2)散乱点云模型修复孔洞修复一般过程为:识别孔洞边界,根据边界点特征进行离散化曲面构建;通过曲面上的点,进行点云的修复。
3、基于模型检索的修复方法是通过部分输入数据与大型形状数据库中的模板模型进行匹配完成形状修复。检索的关键问题是构造有效检索的特征。
4、基于深度学习的修复方法当前主要为通过卷积神经网络对点云特征学习,直接生成点云数据的修复方法。基于深度学习网络的修复方法是直接在原始点云上运行,而无须对基础点云进行假设,通过编码器和解码器两部分生成点云进行缺失部分的修复。(基于深度学习的方法主要应用于点云补全)

5.公共点云数据集

斯坦福数据集:https://graphics.stanford.edu/data/3Dscanrep/
paper with code的三维数据集:
https://paperswithcode.com/datasets?mod=3d&page=1
常见的点云下载地址/点云集合/点云库30个:https://blog.csdn.net/sunnyrainflower/article/details/129440620
点云数据集大全(附官网地址和下载链接):http://t.csdnimg.cn/be5gM

6.实验案例

算法实验使用的电脑配置为处理器Intel® Core™ i5-8265U CPU @ 1.60GHz 1.80 GHz、Windows 11 64 位操作系统,算法实现采用PyCharm,使用Python语言,用到的库有pymeshfix、pyvista、Open3D。实验采用斯坦福公共点云数据集和github上代码自带的sphere和eight数据。实验过程使用Geomagic人工扣洞,并进行数据读取和展示。
pymeshfix源代码:https://github.com/pyvista/pymeshfix
pyvista官网地址:https://pymeshfix.pyvista.org/index.html
实验用于修复的sphere和eight原链接找不到了,因此分享百度网盘里保存过的sphere和eight数据,文件包含c++孔洞修复的代码及其数据。以下是我在学习期间找到的一些代码,附上百度网盘连接:
通过百度网盘分享的文件:3D三角形网格模…等4个文件
链接:https://pan.baidu.com/s/1DwfSCHsZHls56m2EvS83wg
提取码:on2p
复制这段内容打开「百度网盘APP 即可获取」

6.1三角网格孔洞填充

此代码参考博文:http://t.csdnimg.cn/9r0mH
具体修复代码如下:

import pymeshfix as mf
import pyvista as pv
# 读取并展示原始网格模型
bunny = pv.read("bun_ziphole.ply")
bunny.plot()
# 使用 pymeshfix 进行孔洞提取和修复
meshfix=mf.MeshFix(bunny)
holes=meshfix.extract_holes()
# 可视化原始网格模型和孔洞
p=pv.Plotter()
p.add_mesh(bunny,color=True)
p.add_mesh(holes,color="r",line_width=8)
p.enable_eye_dome_lighting()
p.show()
# 使用 pymeshfix 修复网格
meshfix.repair(verbose=True)
# 提取修复后的网格模型
meshfix.mesh.plot()

实验结果如下:
(1)sphere带洞模型
请添加图片描述
修复后模型较完整,与原模型无差别。
请添加图片描述
(2)eight
下方孔洞较大处修补不平整
请添加图片描述

请添加图片描述
(3)Armadillo
请添加图片描述
请添加图片描述
(4)bunny
这个兔子有7个洞,该算法可以自动修补每一个洞,脚底平整处修补效果良好,但是在兔子细节特征明显处修补效果不佳。
请添加图片描述
请添加图片描述
在这里插入图片描述
在这里插入图片描述

当兔子的细节特征丢失不多的情况下,该算法还是可以呈现较好的修复效果。
在这里插入图片描述

请添加图片描述

6.2修复孔洞并保存

代码如下:

import pymeshfix as mf
import pyvista as pv

# 读取三维点云模型
bunny = pv.read("bun_onehole.ply")

# 进行孔洞修复
meshfix = mf.MeshFix(bunny)
meshfix.repair(verbose=True)

# 保存修复完成后的三维点云模型
output_filename = "bun_onehole_fixed.ply"
meshfix.mesh.save(output_filename)

# 加载修复完成后的三维点云模型并可视化
repaired_bunny = pv.read(output_filename)
repaired_bunny.plot()

6.3将三角网格模型转换为散乱点云模型(.ply–.pcd)

代码如下:

import open3d as o3d

# 读取PLY文件
mesh = o3d.io.read_triangle_mesh("bun_onehole1.ply")

# 提取点云数据
point_cloud = mesh.sample_points_poisson_disk(number_of_points=40000)  # 可以根据需要调整点云的采样数量

# 保存点云数据为PCD文件
o3d.io.write_point_cloud("bun_onehole1.pcd", point_cloud)
# 显示点云数据
o3d.visualization.draw_geometries([point_cloud])

结果如下图:
在这里插入图片描述
在这里插入图片描述

7.参考文献

[1]晏海平. 散乱点云边界提取及孔洞修复算法研究[D].南昌大学,2015.
[2]王春香,梁亮,王耀等.三维点云模型孔洞边界识别的研究综述[J].现代制造工程,2019(07):157-162.
[3]王春香,孟宏,张勇.散乱点云的孔洞识别和边界提取算法研究[J].机械设计与制造,2019(03):74-76+81.
[4]王春香,郝林文,王耀等.点云模型孔洞修补研究综述[J].现代制造工程,2020(09):156-162.
[5]赵江洪,孙铭悦,王殷瑞等.三维点云孔洞修复方法综述[J].测绘科学,2021,46(01):114-123.
[6]崔文,陈辉,刘万泉.激光三角网格点云孔洞曲面修补方法[J].激光与光电子学进展,2021,58(20):344-355.

这篇文章是对自己学习的一个总结,有很多不足的地方,欢迎大家交流讨论!

  • 28
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值