Python 罗德里格矩阵的空间坐标转换——两组公共点求所属坐标系的旋转矩阵与平移矩阵

var code = "69c58911-f211-47df-9a1e-5e8192157285"
import numpy as np

# 罗德里格矩阵模型,根据公共点计算旋转矩阵与平移矩阵
def RodriguesMatrixModel(src, dst):
    # 计算比例关系
    scale = np.sum(np.sqrt(np.sum((dst - np.mean(dst, axis=0)) ** 2, axis=1))) / np.sum(np.sqrt(np.sum((src - np.mean(src, axis=0)) ** 2, axis=1)))
    # 计算旋转矩阵
    src_mean = np.mean(src, axis=0)
    dst_mean = np.mean(dst, axis=0)
    src = src - src_mean
    dst = dst - dst_mean
    H = np.dot(src.T, dst)
    U, S, Vt = np.linalg.svd(H)
    R = np.dot(Vt.T, U.T)
    if np.linalg.det(R) < 0:
        Vt[2, :] *= -1
        R = np.dot(Vt.T, U.T)
    # 计算平移矩阵
    t = dst_mean.T - scale * np.dot(R, src_mean.T)
    return R, t, scale


# TEST
if __name__ == '__main__':   
     # 设置原点
    src = np.array([[1, 1, 0], [-1, 1, 0], [1, -1, 0]])
    # 绕Z轴旋转90°,平移(-1, 1, 0)
    R = np.array([[0, -1, 0], [1, 0, 0], [0, 0, 1]])
    t = np.array([[-1], [1], [0]])
    # 计算目标点
    dst = np.dot(src, R.T) + t.T
    print('src = ', src)
    print('dst = ', dst)
    # 计算旋转矩阵与平移矩阵
    R_, t_, scale_ = RodriguesMatrixModel(src, dst)
    # 输出R_保留一位小数
    print('R = ', np.round(R_, 1))
    print('t = ', t_)
    print('scale = ', scale_)

作者:Esofar

出处:https://www.cnblogs.com/WindSnowLi/p/16998142.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   WindSnowLi  阅读(212)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示