2d 点云配准

import numpy as np
def kabsch_2d(P, Q):
    """
    二维点云配准算法,使用Kabsch算法。
    inputs: P  N x 2 numpy矩阵,表示点集P中的二维坐标点
            Q  N x 2 numpy矩阵,表示点集Q中的二维坐标点
    return: A 3 x 2矩阵,前两行为旋转矩阵,最后一行为平移向量
    """
    if (P.size == 0 or Q.size == 0):
        raise ValueError("Empty matrices sent to kabsch")
    centroid_P = np.mean(P, axis=0)
    centroid_Q = np.mean(Q, axis=0)
    P_centered = P - centroid_P
    Q_centered = Q - centroid_Q
    H = P_centered.T.dot(Q_centered)
    U, S, V = np.linalg.svd(H)
    R = U.dot(V).T
    if np.linalg.det(R) < 0:
        V[1, :] *= -1
        R = U.dot(V).T
    t = centroid_Q - R.dot(centroid_P)
    return np.vstack((R, t))
if __name__ == '__main__':
    np.random.seed(0)
    num_points = 5
    P = np.random.rand(num_points, 2)  # 5个二维点的集合P
    # 对Q进行旋转和平移来模拟配准之后的点云
    rotation_angle = np.deg2rad(30)  # 旋转角度为30度
    translation_vector = np.array([0.2, 0.3])  # 平移向量为(0.2, 0.3)
    rotation_matrix = np.array([[np.cos(rotation_angle), -np.sin(rotation_angle)],
                                [np.sin(rotation_angle), np.cos(rotation_angle)]])
    Q = P.dot(rotation_matrix.T) + translation_vector  # 对P进行旋转和平移得到Q
    print("Q",Q)
    # 调用二维点云配准函数
    transform_matrix = kabsch_2d(P, Q)
    print("Transform Matrix (Rotation + Translation):\n", transform_matrix)

    # 将P进行变换,应该与Q尽可能地接近
    transformed_P = P.dot(transform_matrix[:2, :2].T) + transform_matrix[2, :]
    print("Transformed P:\n", transformed_P)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值