Umeyama算法是在点云配准中常用的一个算法,在三维点云配准中通常需要三对以上的点构建对应关系后解算变换矩阵,pcl点云库中使用Eigen库中的Eigen::umeyama进行求解。

Least-Squares Estimation of Transformation Parameters Between Two Point Patterns

两组点集模式下变换参数的最小二乘估计

算法目的

设空间中有两个点集X和Y(X和Y可能是完全相同的两个点集也有可能是从点集中选取的部分点构成的点集),点集X和点集Y处于不同的局部坐标系当中。此算法的目的是通过计算旋转矩阵R、平移矩阵s和缩放系数t,并作用域点集Y上得到Y1,使得X和Y1中每个点的距离差的平方和最小。

计算步骤

根据两个点集的相似变换建立方差

方差公式

首先计算两个点集的均值:

X点集均值
Y点集均值

然后计算两个点集的方差:

X点集的方差
Y点集的方差

其次还要计算X和Y点集的协方差:

协方差

对协方差进行SVD分解,记作UDVT(D = diag(di),d1 >= d2 >= ... >= dm >= 0),其中S表达式为如下方式:

S的表达式

那么相似矩阵中的参数可以表示为如下表达式:

R = USVT
t = uy - cRux
c = tr(DS) / δx2

现在介绍Eigen::umeyama的用法

Umeyama.h中的定义如下:

1
umeyama(const MatrixBase<Derived>& src, const MatrixBase<OtherDerived>& dst, bool with_scaling = true)

由于结果以相似矩阵的形式进行存储,所以需要事先定义一个4*4的矩阵:

1
Eigen::Matrix<double, 4, 4> Result;

相似矩阵

然后定义两个点集用于存储源点云X和目标点云Y的数据(数量为n):

1
2
Eigen::Matrix<double, 3, Eigen::Dynamic> X(3, n);
Eigen::Matrix<double, 3, Eigen::Dynamic> Y(3, n);

最后通过umeyama算法得到结果:

1
Result = Eigen::umeyama(X, Y, false);

__END__

刘光祖
文章作者:刘光祖
文章出处刘光祖的第一篇博文
作者签名:虽然每天菜菜的,但是依然要挤一挤水分
关于主题光祖的小屋
版权声明:文章除特别声明外,均采用 BY-NC-SA 许可协议,转载请注明出处