【SVD求解两组多维点之间的欧式变换矩阵】

文章目录


本文介绍了如何利用SVD奇异值分解求解两组3D点之间的最优旋转R和平移t,以最小化点集变换后的误差。首先对点集进行质心处理,然后构建矩阵W并进行SVD分解,通过调整得到旋转矩阵R和向量t,最终形成变换矩阵。Halcon代码示例展示了具体实现过程。

在这里插入图片描述
在这里插入图片描述

*两组3d点P和Q,每组4个点
 
PX := [0.2,0.4,0.2,0.3]
PY := [0.4,0.6,0.8,0.6]
PZ := [0.6,0.8,0.6,0.5]
QX := [0.25,0.44,0.61,0.3]
QY := [0.32,0.56,0.82,0.4]
QZ := [0.4,0.18,0.6,0.51]
 
 
*对P和Q去质心化处理
create_matrix (3, |PX|, [PX,PY,PZ], P)
mean_matrix (P, 'rows', PMean)
create_matrix(1,|PX|,1,Ones)
mult_matrix (PMean, Ones, 'AB', PSub)
sub_matrix(P,PSub,PShift)
 
create_matrix(3,|QX|,[QX,QY,QZ],Q)
mean_matrix(Q,'rows', QMean)
create_matrix (1, |QX|, 0, Ones)
mult_matrix (QMean, Ones, 'AB', QSub)
sub_matrix (Q, QSub, QShift)
 
*得到步骤2里的W矩阵,这里是3维点,左右W是个3*3矩阵
create_matrix (3, 3, 0, W)
for Index := 0 to |PX|-1 by 1  
    get_sub_matrix (PShift, 0, Index, 3, 1, PVec)
    get_sub_matrix (QShift, 0, Index, 3, 1, QVec)
    transpose_matrix_mod (QVec)
    mult_matrix (PVec, QVec, 'AB', PQ)
    add_matrix_mod (W, PQ)    
endfor
 
*对W进行svd分解
svd_matrix (W, 'full', 'both', U, S, V)
 
 
*计算R
transpose_matrix_mod(U)
mult_matrix (V, U, 'AB', R)
 
*计算R的行列式是否为1
determinant_matrix (R, 'general', Value)
if (Value < 0)
    get_value_matrix (V, [0,1,2], [2,2,2], Value1)
    set_value_matrix (V, [0,1,2], [2,2,2], [-Value1[0],-Value1[1],-Value1[2]])
    mult_matrix (V, U, 'AB', R)
endif
 
*计算t
mult_matrix (R, PMean, 'AB', RPMean)
sub_matrix(QMean,RPMean,t)
 
*得到最后的变换矩阵3*4
create_matrix(3,4,0,HomMat3DID)
set_sub_matrix (HomMat3DID, R, 0, 0)
set_sub_matrix(HomMat3DID, t, 0, 3)
get_full_matrix (HomMat3DID, HomMat3D)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【网络星空】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值