首页 > 编程语言 >Open3D 点云快速全局配准FGR算法(粗配准)

Open3D 点云快速全局配准FGR算法(粗配准)

时间:2024-07-01 19:58:34浏览次数:15  
标签:配准 target fpfh FGR source Open3D registration 点云

目录

一、概述

1.1原理和步骤

1.2关键技术和优势

1.3应用场景

二、代码实现

2.1 关键代码

2.1.1.函数:execute_fast_global_registration

2.1.2调用registration_fgr_based_on_feature_matching函数

2.2完整代码

三、实现效果

3.1原始点云

3.2粗配准后点云


一、概述

        Open3D中的Fast Global Registration(快速全局配准)是一种基于特征匹配的快速点云配准算法,旨在有效地将两个点云快速对齐,以提供初步的配准结果。以下是Fast Global Registration的原理和关键步骤:

1.1原理和步骤

1.特征计算:

        对输入的源点云和目标点云计算全局特征描述符。通常使用的特征包括FPFH(Fast Point Feature Histograms)或SHOT(Signature of Histograms of Orientations)。
特征描述符捕捉了点云局部几何结构的信息,对点云的形状和曲率变化有很好的描述能力。
2.特征匹配:
        利用计算得到的全局特征描述符进行点云之间的特征匹配。这一步旨在找到源点云和目标点云中具有相似局部几何结构的点对。
3.快速全局配准:
        使用匹配到的特征点对进行快速全局配准。Open3D中的Fast Global Registration算法实现了一种高效的配准策略,可以在短时间内获得粗略但有效的全局配准结果。
4.优化:
        为了进一步提升配准精度,可以在快速全局配准的基础上进行后续的优化步骤,如ICP(Iterative Closest Point)算法或更精确的局部优化。

1.2关键技术和优势

  • 高效性:Fast Global Registration算法在保证一定配准质量的前提下,尽可能地减少计算时间,适合于处理大规模点云数据。
  • 特征描述符:利用全局特征描述符可以有效地捕捉点云的局部特征信息,避免了传统方法中对全局搜索的依赖,加快了配准过程。
  • RANSAC:算法内部可能会使用RANSAC(随机采样一致性)算法来估计初始的变换参数,以应对部分匹配或噪声的影响。

1.3应用场景

        Fast Global Registration适用于需要快速处理大规模点云数据并获得初步对齐结果的场景,例如机器人感知、三维重建、虚拟现实和增强现实等领域。它为后续更精细的点云配准和分析提供了良好的初始对齐结果,有助于提升整体系统的效率和准确性。

二、代码实现

2.1 关键代码

这段代码实现了基于特征匹配的快速全局配准(Fast Global Registration,FGR)过程:

# --------------------------------------------FastGlobalRegistration配准----------------------------------------------
def execute_fast_global_registration(source, target, source_fpfh, target_fpfh):  # 传入两个点云和点云的特征
    distance_threshold = 0.5  # 设定距离阈值
    print(":: Apply fast global registration with distance threshold %.3f" \
          % distance_threshold)
    result = o3d.pipelines.registration.registration_fgr_based_on_feature_matching(
        source, target, source_fpfh, target_fpfh,
        o3d.pipelines.registration.FastGlobalRegistrationOption(
            maximum_correspondence_distance=distance_threshold))
    return result

2.1.1.函数:execute_fast_global_registration

def execute_fast_global_registration(source, target, source_fpfh, target_fpfh):
    distance_threshold = 0.5  # 设定距离阈值
    print(":: Apply fast global registration with distance threshold %.3f" % distance_threshold)

参数:

  • source:源点云对象。
  • target:目标点云对象。
  • source_fpfh:源点云的FPFH特征。
  • target_fpfh:目标点云的FPFH特征。

2.1.2调用registration_fgr_based_on_feature_matching函数

result = o3d.pipelines.registration.registration_fgr_based_on_feature_matching(
    source, target, source_fpfh, target_fpfh,
    o3d.pipelines.registration.FastGlobalRegistrationOption(
        maximum_correspondence_distance=distance_threshold))

参数解释:

  • source 和 target:需要配准的源点云和目标点云。
  • source_fpfh 和 target_fpfh:源点云和目标点云的FPFH特征。
  • FastGlobalRegistrationOption:指定了快速全局配准的参数选项。
  • maximum_correspondence_distance:最大对应点距离阈值。该阈值用于筛选特征匹配点对,超过该距离的点对将被忽略。

2.2完整代码

import open3d as o3d
import time
import copy


# ----------------------------------------------传入点云数据,计算FPFH-------------------------------------------------
def fpfh_compute(pcd):
    radius_normal = 0.01  # kdtree参数,用于估计法线的半径,
    print(":: Estimate normal with search radius %.3f." % radius_normal)
    pcd.estimate_normals(
        o3d.geometry.KDTreeSearchParamHybrid(radius=radius_normal, max_nn=30))
    # 估计法线的1个参数,使用混合型的kdtree,半径内取最多30个邻居
    radius_feature = 0.025  # kdtree参数,用于估计FPFH特征的半径
    print(":: Compute FPFH feature with search radius %.3f." % radius_feature)
    # 计算FPFH特征,搜索方法kdtree
    pcd_fpfh = o3d.pipelines.registration.compute_fpfh_feature(pcd,
                                                               o3d.geometry.KDTreeSearchParamHybrid
                                                               (radius=radius_feature, max_nn=50))
    return pcd_fpfh  # 返回FPFH特征


# --------------------------------------------FastGlobalRegistration配准----------------------------------------------
def execute_fast_global_registration(source, target, source_fpfh, target_fpfh):  # 传入两个点云和点云的特征
    distance_threshold = 0.5  # 设定距离阈值
    print(":: Apply fast global registration with distance threshold %.3f" \
          % distance_threshold)
    result = o3d.pipelines.registration.registration_fgr_based_on_feature_matching(
        source, target, source_fpfh, target_fpfh,
        o3d.pipelines.registration.FastGlobalRegistrationOption(
            maximum_correspondence_distance=distance_threshold))
    return result


# ---------------------------------------------------可视化配准结果----------------------------------------------------
def draw_registration_result(source, target, transformation):
    source_temp = copy.deepcopy(source)  # 由于函数transformand paint_uniform_color会更改点云,
    target_temp = copy.deepcopy(target)  # 因此调用copy.deepcoy进行复制并保护原始点云。
    source_temp.paint_uniform_color([1, 0, 0])  # 点云着色
    target_temp.paint_uniform_color([0, 1, 0])
    source_temp.transform(transformation)
    # o3d.io.write_point_cloud("trans_of_source.pcd", source_temp)  # 保存配准后的点云
    o3d.visualization.draw_geometries([source_temp, target_temp], width=600, height=600, mesh_show_back_face=False)


if __name__ == "__main__":
    #  --------------------读取点云数据------------------
    source = o3d.io.read_point_cloud("..//..//standford_cloud_data//hand_trans.pcd")
    target = o3d.io.read_point_cloud("..//..//standford_cloud_data//hand.pcd")
    source = source.uniform_down_sample(every_k_points=10)
    target = target.uniform_down_sample(every_k_points=10)
    start = time.time()
    #  -----------计算源点云和目标点云的FPFH-------------
    source_fpfh = fpfh_compute(source)
    target_fpfh = fpfh_compute(target)
    # ------------------调用FGR执行粗配准----------------
    result_fast = execute_fast_global_registration(source, target,
                                                   source_fpfh, target_fpfh)
    print("Fast global registration took %.3f sec.\n" % (time.time() - start))
    print(result_fast)
    draw_registration_result(source, target, result_fast.transformation)  # 源点云旋转平移到目标点云

三、实现效果

3.1原始点云

3.2粗配准后点云

标签:配准,target,fpfh,FGR,source,Open3D,registration,点云
From: https://blog.csdn.net/qq_47947920/article/details/140099078

相关文章

  • Open3D 点云的旋转与平移
    目录一、概述1.1旋转1.2平移二、代码实现2.1实现旋转2.2实现平移2.3组合变换三、实现效果3.1原始点云3.2变换后点云一、概述        在Open3D中,点云的旋转和平移是通过几何变换来实现的。几何变换可以应用于点云对象,使其在空间中移动或旋转到新的位置和......
  • (slam工具)4 3D点集配准相似变换sRt计算
      https://github.com/Dongvdong/v1_1_slam_tool  importrandomimportmathimportnumpyasnpimportosdefAPI_pose_estimation_3dTo3d_ransac(points_src,points_dst):#NED->slamp=np.array(points_src,dtype=float)q=np.array(......
  • 【图像准配】用于多模态图像配准的 CCRE(Matlab实现)
     ......
  • QGIS配准工具的变换算法(翻译自QGIS官方文档)
    QGIS配准工具的变换算法配准工具中有多种变换算法可用,具体取决于输入数据的类型和质量、您愿意在最终结果中引入的几何变形的性质和数量,以及地面控制点(GCP)的数量。目前,可以使用以下变换类型:线性算法用于创建坐标定位文件,与其他算法不同,它实际上不会变换栅格像素。它......
  • 基于Open3D的点云处理20- 基于Visualizer类自定义可视化
    1.自定义可视化官网测试用例Open3D/examples/python/visualization/customized_visualization.py自定义可视化工具窗口-Visualizer类Visualizer可视化基础操作defcustom_draw_geometry(pcd):#Thefollowingcodeachievesthesameeffectas:#o3d.v......
  • 基于Open3D对三维数据的处理的实战(持续更新)
    基于Open3D对三维数据的处理的实战(持续更新)前言在当今这个数据驱动的时代,三维视觉技术在众多领域如自动驾驶、机器人、医疗影像、虚拟现实和增强现实等中扮演着越来越重要的角色。而在这个技术洪流中,Open3D作为一个高性能的开源库,为开发者提供了一把钥匙,解锁了高效处理和可视......
  • ENVI自动地理配准:GCP地面控制点的自动产生
      本文介绍基于ENVI软件,利用“ImageRegistrationWorkflow”工具实现栅格遥感影像自动寻找地面控制点从而实现地理配准的方法。  在ENVI手动地理配准栅格图像的方法这篇文章中,我们介绍了在ENVIClassic5.3(64-bit)软件中通过“SelectGCPs:ImagetoImage”工具手动指定......
  • [Open3d系列]--点云平面提取
    Open3d:点云平面拟合因为项目需要分析点云数据,此文总结其中拟合平面经验。加载点云importopen3daso3dplypath="/xxx/xxx.ply"pcd=o3d.io.read_point_cloud(plypath)o3d.visualization.draw_geometries([pcd])效果如下:平面拟合plane_model,inliers=current......
  • QFComponent for lazarus增加新控件TQFGridPanelComponent
    TQFGridPanelComponent控件支持在单元格绑定可视控件,运行时单元格绑定的控件会吸附到相应的单元格里。|姓名|[#][C2]单位|办公地址|备注||:-:|:-:|:-:|:-:||秋风6|[bm4]检测中心1|南山建工村1|||秋风7|检测中心2|<COMPNAME=name3>[#][c4]南山建工村2|||[c2]地址|<COMPNAME=n......
  • 使用open3d分离背景和物体点云(二)
    一、代码Pythonimportcv2importopen3daso3dimportmatplotlib.pyplotaspltimportnumpyasnpdefthPlaneSeg(pointcloud):pcd_np=np.asarray(pointcloud.points)#设置深度阈值(假设Z轴是深度轴)depth_threshold=0.196#1.0米#应......