课程的 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. Django知识总汇

    基础 Django基础 Django基本命令 model系统 ORM基础 ORM字段和参数 ORM对数据库操作 ORM中介模型 ORM之其他骚操作 templates系统 模板语言 views系统 视 ...

  2. 在输入密码框中眼睛睁开可以看见数字,眼睛闭上看不见数字怎么用JS实现

    无论做那个项目,登录注册页面总是避免不了的,那怎么用js来控制密码的显示和隐藏呢?先看一下效果图: HTML代码如下: <div>         <label for=" ...

  3. ZOJ2760_How Many Shortest Path

    给一个图,求从某个点到另一个点的最短路有多少条?所有的路都不共边. 首先从终点开始Spfa标记最短距离,然后建图. 建图的时候,如果满足两点之间的最短路只差为两点之间的边长,那么在网络流的模型中连接一 ...

  4. HDU4292_Food

    给出一些人,一些食物,一些饮料,每个人都只喜欢喝某些饮料,吃某些食品,每个食品和饮料都有一定的数量,现在问最多能满足多少人的需求. 注意理解题意了,每个人只需要要拿一个食物和一个饮料即可,这题目说得好 ...

  5. BZOJ 2143 飞飞侠(分层最短路)

    飞飞国是一个N×M的矩形方阵,每个格子代表一个街区.然而飞飞国是没有交通工具的.飞飞侠完全靠地面的弹射装置来移动.每个街区都装有弹射装置.使用弹射装置是需要支付一定费用的.而且每个弹射装置都有自己的弹 ...

  6. Intelligent Factorial Factorization LightOJ - 1035(水题)

    就是暴力嘛...很水的一个题... 不好意思交都... #include <iostream> #include <cstdio> #include <sstream&g ...

  7. 洛谷 P1939 【模板】矩阵加速(数列) 解题报告

    P1939 [模板]矩阵加速(数列) 题目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值 ...

  8. 一次lvs迁移记录

    需求:从117.119.33.99迁移到122.14.206.125,lvs为dr模式,系统版本为debian7 1.安装lvs和keepalived # aptitude install -y ip ...

  9. bzoj2146 Construct

    题目描述 随着改革开放的深入推进…… 小T家要拆迁了…… 当对未来生活充满美好憧憬的小T看到拆迁协议书的时候,小T从一位大好的社会主义青年变成了绝望的钉子户. 由于小T的家位于市中心,拆迁工作又难以进 ...

  10. Jenkins(一)---我理解的jenkins是这样的

    1.齿轮 如果将 java / maven / ant / git / tomcat / jenkins 等等软件比喻为齿轮:如下图 两个软件在一起可以驱动另外一个软件:如下图 如果把这些软件要集成在 ...