课程的 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}) = A\mathbf{x} + b \]

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

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

其中

\[ u(\mathbf{x}) = S(\mathbf{x})p = \begin{bmatrix} x & y & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & x & y & 1\end{bmatrix} {\begin{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) = \nabla I^T ({d\mathbf{x} \over dt}) + {\partial I \over \partial t} = 0 \]

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

\[ \nabla 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})} {| \nabla I(\mathbf{x'}, t)^Tv + I_t(\mathbf{x'}, t) |}^2 d\mathbf{x'} \]

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

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

其中

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

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

使用位移模型时能量项为

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

使用仿射模型时能量项为

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

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

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

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

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

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

\[ det(M) \ge \theta \]

4. 特征点提取

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

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

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

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

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

6. 长基线匹配

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

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

\[ NCC(h) = {\int_{W(\mathbf{x})} (I_1(\mathbf{x'}) - \bar I_1) (I_2(A\mathbf{x'} + d) - \bar I_2) d\mathbf{x'} \over \sqrt{\int_{W(\mathbf{x})}(I_1(\mathbf{x'}) - \bar I_1)^2d\mathbf{x'} \int_{W(\mathbf{x})} (I_2(A\mathbf{x'} + d) - \bar I_2)^2 d\mathbf{x'}}} \]

鲁棒性体现在:

  1. 在积分前减去了 patch 内分子的平均值,对光照的定值增强 $I \rightarrow I + \gamma $ 鲁棒;
  2. 除以了 patch 的标准差,对光照的比例增强 \(I \rightarrow \gamma I\) 鲁棒。

【多视图几何】TUM 课程 第4章 同名点匹配的更多相关文章

  1. 【多视图几何】TUM 课程 第6章 多视图重建

    课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 .视频评论区可以找到课 ...

  2. 【多视图几何】TUM 课程 第3章 透视投影

    课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 .视频评论区可以找到课 ...

  3. 【多视图几何】TUM 课程 第5章 双视图重建:线性方法

    课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 .视频评论区可以找到课 ...

  4. 【多视图几何】TUM 课程 第2章 刚体运动

    课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 .视频评论区可以找到课 ...

  5. 【多视图几何】TUM 课程 第1章 数学基础:线性代数

    在 YouTube 上找到了慕尼黑工业大学(Technische Universitaet München)计算机视觉组 Daniel Cremers 教授的 Multiple View Geomet ...

  6. javascript进阶课程--第三章--匿名函数和闭包

    javascript进阶课程--第三章--匿名函数和闭包 一.总结 二.学习要点 掌握匿名函数和闭包的应用 三.匿名函数和闭包 匿名函数 没有函数名字的函数 单独的匿名函数是无法运行和调用的 可以把匿 ...

  7. C#入门到精通系列课程——第3章变量及运算符

    ◆本章内容 (1)变量是什么 (2)变量的声明及初始化 (3)常量 (4)运算符 (5)数据类型转换 (6)运算符优先级及结合性 (7)难点解答 ◆本章简述 很多人认为学习C#之前必须要学习C++,其 ...

  8. C#入门到精通系列课程——第2章编写C#程序

    ◆本章内容 (1)熟悉Visual Studio 2017开发环境 (2)编写第一个C#程序 (3)C#程序结构预览 (4)程序编写规范 (5)难点解答 ◆本章简述 要学习C#编程,必然要熟悉C#程序 ...

  9. C#入门到精通系列课程——第1章软件开发及C#简介

    ◆本章内容 (1)了解软件 (2)软件开发相关概念 (3)认识.NET Framework (4)C#语言 (5)Visual Studio 2017 ◆本章简述 软件在现代人们的日常生活中随处可见, ...

随机推荐

  1. UVA11248_Frequency Hopping

    给一个有向网络,求其1,n两点的最大流量是否不小于C,如果小于,是否可以通过修改一条边的容量使得最大流量不小于C? 首先对于给定的网络,我们可以先跑一遍最大流,然后先看流量是否大于C. 然后保存跑完第 ...

  2. java链表的各种操作

    java里面没有指针的说法,所以初始化的时候,就是新建一个null节点就是一个空链表了.//C里面链表会有头指针,头指针指向头节点 如果想向空链表插入第一个节点,直接head=newNode: 注意的 ...

  3. python使用selenium、PhantomJS获得网站cookie信息#windows

    首先python安装selenium,命令行中输入 pip install selenium 在执行代码如下代码时出现错误 driver=webdriver.PhantomJS() 错误如下 sele ...

  4. 【比赛】NOIP2017 宝藏

    这道题考试的时候就骗了部分分.其实一眼看过去,n范围12,就知道是状压,但是不知道怎么状压,想了5分钟想不出来就枪毙了状压,与AC再见了. 现在写的是状压搜索,其实算是哈希搜索,感觉状压DP理解不了啊 ...

  5. 【刷题】BZOJ 5091 [Lydsy1711月赛]摘苹果

    Description 小Q的工作是采摘花园里的苹果.在花园中有n棵苹果树以及m条双向道路,苹果树编号依次为1到n,每条道路的两端连接着两棵不同的苹果树.假设第i棵苹果树连接着d_i条道路.小Q将会按 ...

  6. > Manifest merger failed with multiple errors, see logs -- Android Studio问题汇总

    FAQ:> Manifest merger failed with multiple errors, see logs 解决: 此问题产生原因大概有三个 # 第一,清单文件有错,这种错不会在编译 ...

  7. spark 调优——基础篇

    开发调优 调优概述 Spark性能优化的第一步,就是要在开发Spark作业的过程中注意和应用一些性能优化的基本原则.开发调优,就是要让大家了解以下一些Spark基本开发原则,包括:RDD lineag ...

  8. MVC中数据验证

    http://www.studyofnet.com/news/339.html http://www.cnblogs.com/kissdodog/archive/2013/05/04/3060278. ...

  9. Python完成RF测试用例

    Robot Framework 框架是基于 Python 语言开发的,所以,它本质上是 Python 的一个库. from robot.api import TestSuite from robot. ...

  10. a标签--超链接

    一.链接到其他网站 <body> <a href="https://www.baidu.com" target="_blank">百度& ...