zoukankan      html  css  js  c++  java
  • 【多视图几何】TUM 课程 第4章 同名点匹配

    课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 。视频评论区可以找到课程所使用课件与练习题的下载地址。

    课程第4章介绍了如何在两幅影像上匹配同名点,匹配同名点是计算影像相对姿态的第一步。用光流、特征点提取方法进行同名点匹配。

    1. 从影像到几何

    影像呈现的是色彩与亮度,但 MVG 使用匹配点或线进行三维重建,所以从影像的色彩信息中提取点或线是传统 MVG 的第一步。

    为什么说是“传统 MVG ”呢?因为在以前计算资源匮乏的时代,只能通过稀疏的点与线进行三维重建。当今计算资源丰富,内存能够存储大量的信息,可以将影像的每一个像素存入内存参与计算,这种方式属于“直接法”,在课程的后半部分会讨论到。

    从影像中提取同名点有存在两大挑战:1. 非刚体变化,影像中出现的非刚体在两张影像对应的两个时间点上一些特征点完全消失,无法匹配;2. 非朗博面,存在镜面反射,在不同角度观察空间位置上的同一个点存在着亮度相差特别大的问题。

    在同名点匹配可以分为两种情形:

    1. 微小移动,意味着基线短,两张影像中同名特征点之间的距离短,容易通过小窗口找到,同名点的寻找方向也基本一致;
    2. 长基线,相机移动很大,左影像的特征点有可能在右影像的任何位置上。

    对于短基线的情形,使用光流法(Optical Flow)进行特征点匹配,该方法是 Lucas 与 Kanade 于1981年提出的。

    在两张影像上寻找同名点是在二维的影像平面上进行寻找,不涉及将特征点投影到三维空间进行寻找,因为这一步只是在一张影像上找到特征点,另一张影像上对应的点还没有找到,怎么投影嘛。。。

    2. 微小移动建模

    首先,对特征点的运动进行建模。

    假设右影像相对左影像的位姿为 (R, T),于是对于左影像上一特征点(坐标为 (x_1))和右影像上该特征点对应的坐标 $ x_2 $ 之间的关系为

    [mathbf{x_2} = h(mathbf{x_1}) = {1 over lambda_2(mathbf{X})}( R lambda_1 (mathbf{X})mathbf{x_1} + T ) ]

    $ mathbf{X} $ 是特征点的三维坐标,$ lambda_1(mathbf{X}) $ 是特征点在左影像上的景深,$ lambda_2(mathbf{X}) $ 是特征点在右影像上的景深。

    对这个公式进行简化,用较为简单的形式对 (x_1, x_2) 的这种关系建模。

    位移模型:

    [h(mathbf{x}) = mathbf{x} + b ]

    仿射变换模型:

    [h(mathbf{x}) = Amathbf{x} + b ]

    仿射变换模型也可以写成如下的形式

    [h(mathbf{x}) = mathbf{x} + u(mathbf{x}) ]

    其中

    [u(mathbf{x}) = S(mathbf{x})p = egin{bmatrix} x & y & 1 & 0 & 0 & 0 \ 0 & 0 & 0 & x & y & 1end{bmatrix} {egin{bmatrix} p_1 & p_2 & p_3 & p_4 & p_5 & p_6 end{bmatrix}}^T ]

    3. Lucas-Kanade 方法

    Lucas-Kanade 方法建立在一个假设(assumption)之上,这个假设是“同一特征点在不同影像上保持亮度不变”。(当然在当下的语境下,应该是“色彩保持不变”,当时主要使用灰度影像嘛。)

    该假设希望特征点对应的物体表示是朗博面,漫反射的成分远远大于镜面反射的成分,这样更容易达到在不同角度下拍摄亮度不变的条件。

    在该假设的基础上建立数学模型。亮度保持假设的数学表达为:

    [I(mathbf{x}(t), t) = const. quad forall t ]

    式子中 $ mathbf{x}(t) $ 表示一在各影像上移动的点在 (t) 时刻对应的那张影像上的坐标,整个式子表示 (I(mathbf{x}(t), t))(t) 时刻影像在 (mathbf{x}(t)) 位置上的亮度值。在任意时刻 (t) 这个亮度值都应该是相同的。

    既然是一个对时间 $ t $ 的常数函数,那么对时间 $ t $ 求导得到的导函数就应该恒为0了。

    [{d over dt}I(mathbf{x}(t), t) = abla I^T ({dmathbf{x} over dt}) + {partial I over partial t} = 0 ]

    这个式子就是光流法的约束条件。但是这个式子没有办法解出 $ v = {dmathbf{x} over dt} $ ($ v $ 就可以被称作是“点 (mathbf{x}) 的光流”),因为一个点的亮度值、梯度值并不足以确定一个点在图像中的位置。于是将一个点扩展到一个窗口,做出假设“距离较近的点在两张影像上的移动方向与大小一致”。于是在以 (mathbf{x}) 为中心一个窗口 (W(mathbf{x})) 中的任意一点 $ mathbf{x'} $ 都满足上面的约束条件。

    [ abla I(mathbf{x'}, t)^Tv + {partial I over partial t}(mathbf{x'}, t) = 0 quad forall mathbf{x'} in W(mathbf{x}) ]

    当然由于物体非朗博特性、相机移动、影像噪声等的存在上面这个式子不可能完全成立,所以尽可能让式子左边等于右边,将一个能量项优化到最小,目的就达到了。

    Lucas 和 Kanade 在1981年提出了优化下面这个能量项,以找到最优的光流:

    [E(v) = int_{W(mathbf{x})} {| abla I(mathbf{x'}, t)^Tv + I_t(mathbf{x'}, t) |}^2 dmathbf{x'} ]

    求导等于0,得到下面的式子

    [{ dE over dv } = 2Mv + 2q = 0 ]

    其中

    [M = int_{W(mathbf{x})} abla I abla I^T dmathbf{x'}, quad q = int_{W(mathbf{x})} I_t abla I dmathbf{x'}, quad I_t = {partial I over partial t} ]

    [Rightarrow v = -M^{-1}q, quad det(M) e 0 ]

    使用位移模型时能量项为

    [E(v) = int_{W(mathbf{x})} {| abla I^T(mathbf{x'})b + I_t(mathbf{x'}) |}^2 dmathbf{x'} ]

    使用仿射模型时能量项为

    [E(v) = int_{W(mathbf{x})} {| abla I^T(mathbf{x'})S(mathbf{x'})p + I_t(mathbf{x'}) |}^2 dmathbf{x'} ]

    下面是 (M)(q) 的详细公式:

    [M(mathbf{x}) = int_{W(mathbf{x})} egin{bmatrix} I_x^2 & I_xI_y \ I_xI_y & I_y^2 end{bmatrix} dmathbf{x'} ]

    [q = egin{bmatrix} int_{W(mathbf{x})} I_x I_t dmathbf{x'} \ int_{W(mathbf{x})} I_y I_t dmathbf{x'} end{bmatrix} ]

    整个问题的求解需要 (M) 可逆,也就是说在这个窗口中梯度 (I_x) 不能为0,(I_y) 也不能为0。这是一个“与”的关系,两个都不能为0,若其中有一个为0, (det(M) = 0)(det(M)) 为0对应着相机对着“白墙”或者“白墙边缘”的情况。

    理想情况是理想情况,现实世界中充满了误差,所以 (det(M)) 不会完全为0,这个时候对 (det(M)) 的要求是不能小于一个比较小的值 ( heta, heta gt 0)

    [det(M) ge heta ]

    4. 特征点提取

    上面计算光流的能量函数,还是有一点点简单。在实际问题中,真实情况是“两点之间像素距离越近光流越接近”,所以应该使用用权重对窗口中不同区域的点的代价进行赋值,实际实现是使用高斯核进行卷积。

    [M(mathbf{x}) equiv G_{sigma} cdot abla I abla I = int G_{sigma}(mathbf{x} - mathbf{x'}) egin{bmatrix} I_x^2 & I_xI_y \ I_xI_y & I_y^2 end{bmatrix}_{mathbf{x'}} dmathbf{x'} ]

    这一节不是讨论光流问题,是讨论“特征点提取”。Harris 角点提取方法就是依据上面这个公式计算一个数值,如果该数值大于阈值表示该点很有可能是一角点。计算方式如下:

    [C(mathbf{x}) = det(M) - kappa trace^2(M) ]

    选择那些 $ C(mathbf{x}) > heta, heta gt 0 $ 的点作为角点提取出来。

    6. 长基线匹配

    长基线的匹配问题中,不同的特征点在在两张影像上的相对位置都不一样,不具有规律性,一般是直接在整个窗口中进行暴力搜索。长基线情况下也涉及到特征点观察角度、光照条件不同(户外随着时间推移,太阳高度角发生变化)给匹配带来难度。

    使用归一化互相关系数(Normalized Cross Correlation)计算两张影像 patch 之间的相关系比较鲁棒,计算方法如下。

    [NCC(h) = {int_{W(mathbf{x})} (I_1(mathbf{x'}) - ar I_1) (I_2(Amathbf{x'} + d) - ar I_2) dmathbf{x'} over sqrt{int_{W(mathbf{x})}(I_1(mathbf{x'}) - ar I_1)^2dmathbf{x'} int_{W(mathbf{x})} (I_2(Amathbf{x'} + d) - ar I_2)^2 dmathbf{x'}}} ]

    鲁棒性体现在:

    1. 在积分前减去了 patch 内分子的平均值,对光照的定值增强 $I ightarrow I + gamma $ 鲁棒;
    2. 除以了 patch 的标准差,对光照的比例增强 (I ightarrow gamma I) 鲁棒。
  • 相关阅读:
    最大回文子串
    找出不含重复字符的最长子串的长度
    链表表示的2个数相加
    如何胜任一个小型公司的技术总监?我的感想
    React 的坑
    MobX 学习
    摘要
    AI 帮助涂鸦
    计算机的前世今生
    常用编辑器实用技巧(pycharm、sublimeText、vim、vscode、Jupyter)
  • 原文地址:https://www.cnblogs.com/JingeTU/p/6390871.html
Copyright © 2011-2022 走看看