Open3D 点云CPD算法配准(粗配准)

目录

一、概述

二、代码实现

2.1关键函数

2.2完整代码

三、实现效果

3.1原始点云

3.2配准后点云


一、概述

在Open3D中,CPD(Coherent Point Drift,一致性点漂移) 算法是一种经典的点云配准方法,适用于无序点云的非刚性(非刚体)配准问题。CPD算法通过建模点云之间的概率关系,以最大化对应点对之间的一致性来实现配准。以下是CPD算法的详细原理介绍:

CPD算法通过以下步骤来实现点云的非刚性配准:
1.问题建模:

假设有两个点云:源点云(source)和目标点云(target)。目标是找到一个概率转移矩阵和变换矩阵,将源点云的点映射到目标点云上,同时考虑点之间的一致性和概率分布。
2.概率分布建模:

  • 假设每个源点在目标点云上的对应位置服从高斯分布。

  • 建立概率转移矩阵P来表示每个源点对目标点的概率。
    3.优化目标:

CPD算法通过最大化点云之间的一致性来优化配准结果。具体来说,它最小化源点云与目标点云之间的KL散度(Kullback-Leibler divergence),以确定最佳的变换和对应关系。
4.迭代优化:

CPD算法使用迭代方法来逐步优化变换矩阵和概率转移矩阵。每次迭代包括两个主要步骤:

  • E步骤(Expectation):更新每个源点的对应概率,基于当前的变换矩阵和目标点云的位置。

  • M步骤(Maximization):更新变换矩阵,将源点云映射到目标点云上,最大化对应点对之间的一致性。
    5.收敛判据:

CPD算法通常会设定迭代次数或者设定一个收敛准则来终止迭代过程,例如KL散度变化小于某个阈值或者达到最大迭代次数。

二、代码实现

2.1关键函数

复制代码
def registration_cpd(source, target, tf_type_name='rigid',
                     w=0.0, maxiter=50, tol=0.001,
                     callbacks=[], **kargs):
  • tf_type_name (str, optional):转换类型('刚性','仿射','非刚性')
  • w (float, optional):均匀分布的权重,0 < ' w ' < 1。
  • maxitr (int, optional):EM算法的最大迭代次数。
  • tol (float, optional): 停止迭代的最小容忍偏差

2.2完整代码

复制代码
import open3d as o3d
import numpy as np
from probreg import cpd
import time
import copy


#  --------------------读取点云数据------------------
source = o3d.io.read_point_cloud("..//..//standford_cloud_data//Horse.pcd")
target = o3d.io.read_point_cloud("..//..//standford_cloud_data//Horse_trans.pcd")

source = source.uniform_down_sample(every_k_points=10)
target = target.uniform_down_sample(every_k_points=10)

# 点云上色
source.paint_uniform_color([0, 0, 1])
target.paint_uniform_color([0, 1, 0])
o3d.visualization.draw_geometries([source, target], window_name="点云初始位置",
                                  width=1024, height=768,
                                  left=50, top=50,
                                  mesh_show_back_face=False)  # 可视化点云初始位置
# CPD算法进行配准
start = time.time()
tf_param, _, _ = cpd.registration_cpd(source, target,        # 源点云和目标点云
                                      tf_type_name='rigid',  # 计算变换矩阵的类型('rigid', 'affine', 'nonrigid')
                                      w=0.0,                 # 均匀分布的权重,0 < ' w ' < 1。
                                      maxiter=50,            # EM算法的最大迭代次数。
                                      tol=0.001)             # 停止迭代的最小容忍偏差
result = copy.deepcopy(source)
result.points = tf_param.transform(result.points)
print("配准用时: %.3f sec.\n" % (time.time() - start))
# 可视化配准结果
target.paint_uniform_color([1, 0, 0])
result.paint_uniform_color([0, 0, 1])
o3d.visualization.draw_geometries([target, result], window_name="CPD算法配准",
                                  width=1024, height=768,
                                  left=50, top=50,
                                  mesh_show_back_face=False)

三、实现效果

3.1原始点云

3.2配准后点云

相关推荐
杨超越luckly3 分钟前
HTML应用指南:利用GET请求获取中国生活垃圾焚烧发电厂位置信息
python·arcgis·html·数据可视化·生活垃圾焚烧发电厂
Genios5 分钟前
今天是我正式开启Python学习之旅的第7天
开发语言·python·学习
maxmaxma8 分钟前
ROS2机器人少年创客营:Python第一课
前端·python·机器人
模拟器连接器曾工8 分钟前
AI视觉检测设备参数有哪些?从硬件到算法的全面解析
人工智能·算法·视觉检测·ai视觉·ai视觉检测
量子物理学9 分钟前
Open CV 边缘检测算法:Canny、Sobel、Scharr与Laplacian对比解析
人工智能·算法·计算机视觉
.柒宇.11 分钟前
力扣hot 100之和为 K 的子数组(Java版)
java·算法·leetcode
Byte不洛14 分钟前
LeetCode中经典双指针题(环形链表 + 快乐数 + 移动零)
算法·leetcode·链表·数组·双指针
源码之家15 分钟前
计算机毕业设计:汽车销售数据采集分析系统 Flask框架 requests爬虫 可视化 数据分析 大数据 机器学习 大模型(建议收藏)✅
大数据·爬虫·python·信息可视化·flask·汽车·课程设计
Boop_wu15 分钟前
[Java 算法] 快速排序和快速选择排序(※)
数据结构·算法·排序算法
人间打气筒(Ada)17 分钟前
「码动四季·开源同行」golang:负载均衡如何提高系统可用性?
算法·golang·开源·go·负载均衡·负载均衡算法