ICP算法详解——我见过最清晰的解释
迭代最近点(Iterative Closest Point, 下简称ICP)算法是一种点云匹配算法。
假设我们通过RGB-D相机得到了第一组点云 ,相机经过位姿变换(旋转加平移)后又拍摄了第二组点云
,注意这里的
和
的坐标分别对应移动前和移动后的坐标系(即坐标原点始终为相机光心,这里我们有移动前、移动后两个坐标系),并且我们通过相关算法筛选和调整了点云存储的顺序,使得
和
中的点一一对应,如
在三维空间中对应同一个点。
现在我们要解决的问题是:计算相机的旋转 和平移
,在没有误差的情况下,从
坐标系转换到
的公式为:
但由于噪声及错误匹配(如 其实并不对应空间中同一点,但特征匹配算法错误地认为二者是同一点)的存在, 上式不总是成立,所以我们要最小化的目标函数为
常用的求解 和
的方法有:
- SVD
- 非线性优化
非线性优化的描述比较繁琐,下面只介绍SVD方法。为了后面能使用SVD,我们需要在数学上做一点小小的变形。首先定义两组点云的质心(center of mass)为 ,
,并作出如下处理:
MATLAB Example
MATLAB R2018a提供了ICP例程,需要安装Computer Vision System Toolbox,我们来简单看一下这个例子。
%Load point cloud data.
ptCloud = pcread('teapot.ply');
pcshow(ptCloud);
title('Teapot');
%Create a transform object with 30 degree rotation along z -axis and translation [5,5,10].
A = [cos(pi/6) sin(pi/6) 0 0; ...
-sin(pi/6) cos(pi/6) 0 0; ...
0 0 1 0; ...
5 5 10 1];
tform1 = affine3d(A);
%Transform the point cloud.
ptCloudTformed = pctransform(ptCloud,tform1);
pcshow(ptCloudTformed);
title('Transformed Teapot');
%Apply the rigid registration.
tform = pcregistericp(ptCloudTformed,ptCloud,'Extrapolate',true);
%Compare the result with the true transformation.
disp(tform1.T);
tform2 = invert(tform);
disp(tform2.T);