OpenCV 4.10.0
开源计算机视觉
|
本文说明了一种 ICP 算法,该算法用于深度融合管道(例如 KinectFusion)。
ICP 的目标是排列两个点云,旧点云(3D 模型中现有的点和法向量)和新点云(新点和法向量,我们要将其整合到现有的模型中)。ICP 会返回这两个点云之间的旋转和平移变换。
迭代最近点 (ICP) 会最小化目标函数,该函数为两个点云中相应点之间的点到平面距离 (PPD)
具体而言,对于每个相应点P和Q,它为点P到由点Q和位于点Q中的法向量N确定的平面的距离。如果给定当前照相机姿势,两个点P和Q投射到同一像素中,则认为它们是相互对应的。
p - 新点云中的第 i 个点
q - 旧点云中的第 i 个点
n - 旧点云中点q中的法向量
因此,ppd(...)可以表示为(p和q之间的差)和(n)的点积
T(p)为点p的刚性变换
其中R - 旋转,t - 平移。
T是我们通过 ICP 搜索的变换,其目的是在点到平面的距离方面使每个点p更接近相应的点q。
我们使用高斯-牛顿方法最小化函数。
在高斯-牛顿方法中,我们通过改变R和t来让函数 E 减小的方向(即梯度方向)进行顺序步骤
让我们在无限小邻域内对其进行估计。
以下是要通过改变R和t最小化的公式
虽然点到平面的距离对R和t都是线性的,但是旋转空间本身是线性的。你可以从如何从旋转角度生成R中看到这一点
但是由于我们的旋转是无限小的,所以R可以使用以下形式估算
其中I - 单位矩阵,A - 三维特殊正交组so(3) 的成员。
通过将所有 sin(t) 与 cos(t) 项逼近到其t --> 0 的极限,我们得到以下表示
将近似的R 再代入到表达E 中,我们得到
让我们引入一个函数 f 来逼近变换偏移
当E_approx 的微分(即按自变量增量求导数)为零时E_approx 最小,因此让我们找到该微分
让我们对ppd 求导
下面是我们在向量 x 中对所有变量 x_j 所获得的结果
设新变量:
f(x, p) 可表示为矩阵向量乘积。为了证明这一点,我们必须记住
引入G(p) 是一项简化操作。
由于 我们得到 。
设新值为
让我们做替换
通过求解此方程,我们为每次高斯-牛顿迭代获得刚性变换偏移。
我们从偏移生成旋转和平移矩阵,然后将当前姿势矩阵乘以我们获得的矩阵。
尽管平移部分的偏移按原样加到结果矩阵中,但旋转部分的生成要稍微棘手一些。通过指数作用获得从so(3) 到SO(3) 的旋转偏移。事实上,3 x 1 rshift 向量表示旋转轴乘以旋转角度。我们用罗德里格斯变换来从该变量中获得旋转矩阵。有关更多详情,请参阅 维基页面。