Open3D 四元数法实现对应点集配准

目录

一、概述

1.1 基本思想

​1.2详细步骤

二、代码实现

三、实现效果

3.1原始点云

3.2配准后点云

3.3变换矩阵


一、概述

        在点云配准中,四元数法是一种精确计算旋转和平移变换的方法。其目标是找到一个刚体变换,使源点云和目标点云的对应点集之间的误差最小化。四元数法通过利用四元数的性质来优化旋转矩阵的计算,避免了传统方法中的奇异性问题。

1.1 基本思想

1.2详细步骤

二、代码实现

import open3d as o3d
import numpy as np


def solve_transform_quaternion(s, t):
    P = np.asarray(s.points)
    Q = np.asarray(t.points)
    # 判断两个点集中点的个数是否一致
    if P.shape[0] != Q.shape[0]:
        raise Exception("两个点集不匹配")
    else:
        n = P.shape[0]
    # 1、分别求质心
    meanP = np.mean(P, axis=0)
    meanQ = np.mean(Q, axis=0)
    # 2、去质心
    P_ = P - meanP
    Q_ = Q - meanQ
    # 3、构建协方差矩阵D
    D = np.dot(P_.T, Q_)/n
    # 4、计算4 X 4 矩阵中所需元素
    Dt = np.transpose(D)  # D的转置
    tr_D = np.trace(D)    # D的迹
    A_ij = D - Dt
    v_A = np.array([[A_ij[1][2], A_ij[2][0], A_ij[0][1]]])
    M = D + Dt - tr_D * np.eye(3)
    # 5、构建 4 X 4 矩阵
    Ql = np.vstack((np.array([[tr_D]]), np.transpose(v_A)))
    Qr = np.vstack((v_A, M))
    Q = np.hstack((Ql, Qr))
    # 6、求 4 X4 矩阵的特征值与特征向量
    [eig_v, eig_u] = np.linalg.eig(Q)
    i = np.argmax(eig_v)  # 最大特征值的位置
    q = eig_u[:, i]       # 最大特征值对应的特征向量
    # 7、由四元数求旋转矩阵
    R = o3d.geometry.get_rotation_matrix_from_quaternion(q)
    t = meanQ - np.dot(R, meanP)      # 计算平移向量
    # 8、构建欧式变换矩阵
    T = np.eye(4)
    T[:3, :3] = R
    T[:3, 3] = t
    T[3, 3] = 1.0
    return T


# ---------------加载点云数据--------------------
source = o3d.io.read_point_cloud("Horse.pcd")
target = o3d.io.read_point_cloud("Horse_trans.pcd")
# ------对初始位置的点云进行颜色渲染--------------
source.paint_uniform_color([0, 1, 0])  # 绿色
target.paint_uniform_color([0, 0, 1])  # 蓝色
o3d.visualization.draw_geometries([source, target], width=800, height=800)

Tran = solve_transform_quaternion(source, target)
print('变换矩阵为:\n', Tran)
align = source.transform(Tran)
align.paint_uniform_color([1, 0, 0])  # 红色
o3d.visualization.draw_geometries([align, target], width=800, height=800)

三、实现效果

3.1原始点云

3.2配准后点云

3.3变换矩阵

 [[ 1.00000000e+00  1.90151073e-09  1.03664745e-09  1.00000000e-01]
 [-6.11550683e-10  7.07106781e-01 -7.07106781e-01  5.00000000e-02]
 [-2.07759157e-09  7.07106781e-01  7.07106781e-01  1.00000000e-02]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00  1.00000000e+00]]

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
open3d是一个用于处理三维数据(点云、三维模型等)的开源库。点云配准是将两个或多个点云数据进行对齐的过程,以便在一个全局坐标系下进行比较、分析或重建。其中,四元数是一种常用的点云配准四元数是一种用四个实数表示的扩充复数,可以用于描述旋转变换。在点云配准中,使用四元数是因为其具有以下优势: 第一,四元数具有紧凑的表示形式,只需要四个实数即可表示旋转变换,相较于旋转矩阵的九个实数表示方式节省了存储空间,降低了计算复杂度。 第二,四元数能够有效地避免了“万向锁”问题。万向锁是指在使用欧拉角进行坐标变换时,由于旋转过程中会出现奇点,导致旋转角度无精确表示的问题。而四元数不会出现这个问题,具有更好的数值稳定性。 在open3d中,点云配准四元数通常有以下几个步骤: 首先,计算两个点云之间的特征描述子,例如FPFH(Fast Point Feature Histograms)或SHOT(Signature of Histograms of Orientations)。这些描述子能够表示点云的局部几何信息。 然后,根据特征描述子的相似性,寻找初始的点对应关系。 接下来,通过最小化点云之间的误差指标,例如最小化点到平面的距离或最小化点到点的距离,来优化点对应关系,并计算出旋转矩阵。 将旋转矩阵转换为四元数表示,即可完成点云的配准过程。 四元数open3d中常用的点云配准之一,其能够高效地实现点云的准确对齐。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值