open3d完成点云ICP配准

环境:win10,python3.6+open3d==0.8.0
完成点云配准之后的效果图演示
open3d完成点云ICP配准_第1张图片这里直接放上完整的代码

import open3d as o3d
import numpy as np

#读取电脑中的 ply 点云文件
source = o3d.io.read_point_cloud("plys/2.ply")  #source 为需要配准的点云
target = o3d.io.read_point_cloud("plys/1.ply")  #target 为目标点云

#降采样(均匀下采样 使用 open3d 中的 uniform_down_sample)
source = source.uniform_down_sample(every_k_points=10)
print(source)
target = target.uniform_down_sample(every_k_points=10)
print(target)
#o3d.visualization.draw_geometries([uni_down_pcd])

#为两个点云上上不同的颜色
source.paint_uniform_color([1, 0.706, 0])    #source 为黄色
target.paint_uniform_color([0, 0.651, 0.929])#target 为蓝色

#为两个点云分别进行outlier removal,即离群点去除
processed_source, outlier_index = source.remove_statistical_outlier(nb_neighbors=16,std_ratio=0.5)

processed_target, outlier_index = target.remove_statistical_outlier(nb_neighbors=16,std_ratio=0.5)

threshold = 1.0  #移动范围的阀值
trans_init = np.asarray([[1,0,0,0],   # 4x4 identity matrix,这是一个转换矩阵,
                         [0,1,0,0],   # 象征着没有任何位移,没有任何旋转,我们输入
                         [0,0,1,0],   # 这个矩阵为初始变换
                         [0,0,0,1]])
#运行icp
print("Apply point-to-point ICP")
reg_p2p = o3d.registration.registration_icp(
        processed_source, processed_target, threshold, trans_init,
        o3d.registration.TransformationEstimationPointToPoint())

#将我们的矩阵依照输出的变换矩阵进行变换
print(reg_p2p)    #输出配准的结果准确度等信息
print("Transformation is:")
print(reg_p2p.transformation)  # 打印旋转矩阵
processed_source.transform(reg_p2p.transformation)

#创建一个 o3d.visualizer class
vis = o3d.visualization.Visualizer()
vis.create_window()

#将两个点云放入visualizer
vis.add_geometry(processed_source)
vis.add_geometry(processed_target)

#让visualizer渲染点云
vis.update_geometry()
vis.poll_events()
vis.update_renderer()

vis.run()

参考:https://blog.csdn.net/weixin_42488182/article/details/105196148

你可能感兴趣的:(3d)