课程的 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. 配置SSH Forward提升安全性

    目标 MacBook ---(SSH)---> BastionServer ---(SSH)---> RemoteServer   说明 BastionServer.RemoteServe ...

  2. hbase 多个过滤器组合(列表)

    使用FilterList要保证过滤器的顺序需要使用List<Filter> private static void mutilFilterData() throws IOException ...

  3. 【BZOJ4869】【SHOI2017】相逢是问候

    Description BZOJ传送门 Solution 这题涉及到指数嵌套堆叠,可能可以用欧拉函数解决. 试想一个数\(a_i\)经过\(k\)次操作后会变成什么? \[ k个c\;\; \begi ...

  4. Apache Commons IO之FileUtils的常用方法

    Apache Commons IO 在学习io流的时候研究(翻译)了一下这个,只有FileUtils的某些方法,并不全面,还请谅解 org.apache.commons.io 这个包下定义了基于 st ...

  5. android studio 怎么做屏幕适配?

    一.关于布局适配建议1.不要使用绝对布局2.尽量使用match_parent 而不是fill_parent .3.能够使用权重的地方尽量使用权重(android:layout_weight)4.如果是 ...

  6. python print end=' ' 不换行

    python3.x 实现print 不换行 python中print之后是默认换行的,是因为其默认属性 end 默认值为"\n"(\n为换行符). 做练习99乘法表时不想换行,改变 ...

  7. 1044 Shopping in Mars

    Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...

  8. thinkphp3 行为(behavior)分析和基本使用

    1. 名词解析 官方解析: 来自 http://document.thinkphp.cn/manual_3_2.html#behavior_extend 行为(Behavior)是一个比较抽象的概念, ...

  9. NO.2day 操作系统基础

    操作系统基础 1.为什么要有操作系统 操作系统为用户程序提供一个更好.更简单.更清晰的计算机模型,并管理刚才提到的所有设备(磁盘.内存.显示器.打印机等).程序员无法把所有的硬件操作细节都了解到,管理 ...

  10. Hadoop生态圈-hive五种数据格式比较

    Hadoop生态圈-hive五种数据格式比较 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.