Open3d入门 点云拼接算法
点云拼接(Point Cloud Stitching)是将从不同视角或位置获取的多组点云数据对齐到同一个坐标系中的过程,以形成一个完整的三维模型。这项技术在计算机视觉、机器人导航、三维重建和无人驾驶等领域有着广泛的应用。
点云配准(Point Cloud Registration)和点云拼接(Point Cloud Stitching)都是处理多组点云数据的技术。点云配准是指将不同视角或位置获取的点云数据对齐到同一个坐标系中,以确保它们在空间上正确对应;而点云拼接则是在配准的基础上,将这些对齐后的点云数据合并成一个完整的三维模型。两者的联系在于,点云拼接包含点云配准作为其关键步骤,只有准确完成配准,才能实现高质量的拼接。
发展历史
点云拼接的研究可以追溯到20世纪80年代初期,最初应用于医学成像领域。1987年,Besl和McKay提出了迭代最近点(ICP, Iterative Closest Point)算法,这是第一个广泛应用的点云拼接算法。ICP通过迭代优化过程,最小化两组点云之间的欧氏距离,实现点云的配准和拼接。
随着计算机视觉和三维激光扫描技术的发展,点云拼接技术也得到了显著提升。在2000年代中期,随着机器学习和优化算法的进步,许多改进ICP的变种算法被提出,如加权ICP、非刚性ICP等。进入21世纪后,高性能计算设备的普及使得处理大规模点云数据的算法逐渐成熟。
近年来,深度学习技术在点云处理中的应用也得到了广泛关注。PointNet、PointNet++等神经网络模型为点云配准提供了新的思路,通过学习特征表示,可以更加鲁棒地进行点云拼接。同时,SLAM(Simultaneous Localization and Mapping)技术的发展也极大地推动了实时点云拼接技术的进步。
关键算法
-
迭代最近点(ICP)算法:ICP算法是最经典的点云拼接算法,由Besl和McKay在1987年提出。ICP的基本步骤包括:选取初始变换矩阵、寻找最近点对、计算变换矩阵、应用变换矩阵更新点云位置,并重复上述过程直至收敛。ICP算法实现简单且收敛速度快,但对初始位置依赖较大,容易陷入局部最优。
-
基于特征的拼接算法:为了克服ICP算法的局限性,研究者提出了基于特征的拼接算法。这些算法首先在点云中提取关键点和特征描述符,如SIFT、SURF、SHOT等,然后通过匹配这些特征点进行初始配准,最后再通过ICP等方法进行精细对齐。基于特征的算法能够更好地处理具有重复结构或较大初始误差的点云。
-
鲁棒点云拼接算法:在实际应用中,点云数据常常受到噪声和外点的影响。为此,提出了一系列鲁棒点云拼接算法,如加权ICP、Trimmed ICP等。这些算法在ICP的基础上引入了加权机制或排除外点的策略,提高了拼接的鲁棒性和准确性。
-
深度学习方法:随着深度学习的发展,研究者开始利用神经网络进行点云拼接。PointNet、PointNet++等模型通过学习点云的特征表示,可以实现端到端的点云配准。此外,基于生成对抗网络(GAN)和变分自编码器(VAE)的模型也被用于点云拼接,取得了良好的效果。
-
SLAM(Simultaneous Localization and Mapping)技术:SLAM技术在机器人导航和无人驾驶中得到广泛应用,其核心是实时构建环境地图并进行自身定位。SLAM技术中常用的点云拼接算法包括ORB-SLAM、LOAM等,这些算法结合了视觉、激光雷达等多种传感器数据,实现了高精度的实时点云拼接。
点云拼接技术不断发展,各类算法相互结合,使得点云拼接在复杂环境下也能取得良好的效果。随着计算资源的增加和算法的改进,点云拼接将继续在各个领域发挥重要作用。
点云拼接代码示例:
import numpy as np
import open3d as o3d
from copy import deepcopy
if __name__ == '__main__':
file_path = 'bun000.ply'
source = o3d.io.read_triangle_mesh(file_path)
points1 = np.array(source.vertices) #转为矩阵
file_path = 'bun045.ply'
target = o3d.io.read_triangle_mesh(file_path)
points2 = np.array(target.vertices) #转为矩阵
threshold = 0.2 #距离阈值
trans_init = np.array([[1.0, 0.0, 0.0, 0.0],
[0.0, 1.0, 0.0, 0.0],
[0.0, 0.0, 1.0, 0],
[0.0, 0.0, 0.0, 1.0]])
#计算两个重要指标,fitness计算重叠区域(内点对应关系/目标点数)。越高越好。
#inlier_rmse计算所有内在对应关系的均方根误差RMSE。越低越好。
source = o3d.geometry.PointCloud()
source.points = o3d.utility.Vector3dVector(points1)
target = o3d.geometry.PointCloud()
target.points = o3d.utility.Vector3dVector(points2)
print("Initial alignment")
icp = o3d.pipelines.registration.registration_icp(
source, target, threshold, trans_init,
o3d.pipelines.registration.TransformationEstimationPointToPoint())
print(icp)
icp_pcd = deepcopy(source)
icp_pcd.transform(icp.transformation)
print(icp.transformation)
points1 = np.array(icp_pcd.points)
points3 = np.concatenate((points1, points2), axis=0)
con_pcd = o3d.geometry.PointCloud()
con_pcd.points = o3d.utility.Vector3dVector(points3)
con_pcd1 = con_pcd.uniform_down_sample(2)
print(source)
print(target)
print(con_pcd)
print(con_pcd1)
source.paint_uniform_color([0, 1, 0])#指定显示为绿色
target.paint_uniform_color([0, 0, 1])#指定显示为蓝色
target.translate((0.2, 0, 0))#整体沿X轴平移
con_pcd.paint_uniform_color([1, 0, 0])#指定显示为红色
con_pcd.translate((0.4, 0, 0))#整体沿X轴平移
con_pcd1.paint_uniform_color([1, 1, 0])#指定显示为红色
con_pcd1.translate((0.6, 0, 0))#整体沿X轴平移
o3d.visualization.draw_geometries([source, target, con_pcd, con_pcd1], #点云列表
window_name="点云ICP配准",
point_show_normal=False,
width=800, # 窗口宽度
height=600) # 窗口高度
上述拼接实际上是将绿色的点云与蓝色的点云进行重叠拼接,得到红色的点云。当然,红色点云的密度会更高一些。而黄色的点云则是在红色点云的基础上使用均匀下采样轻量化后得到的点云。
以上内容总结自网络,如有帮助欢迎关注与转发,我们下次再见!
原文地址:https://blog.csdn.net/Argulo/article/details/140517841
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!