【多视图几何】TUM 课程 第4章 同名点匹配
课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 。视频评论区可以找到课程所使用课件与练习题的下载地址。
课程第4章介绍了如何在两幅影像上匹配同名点,匹配同名点是计算影像相对姿态的第一步。用光流、特征点提取方法进行同名点匹配。
1. 从影像到几何
影像呈现的是色彩与亮度,但 MVG 使用匹配点或线进行三维重建,所以从影像的色彩信息中提取点或线是传统 MVG 的第一步。
为什么说是“传统 MVG ”呢?因为在以前计算资源匮乏的时代,只能通过稀疏的点与线进行三维重建。当今计算资源丰富,内存能够存储大量的信息,可以将影像的每一个像素存入内存参与计算,这种方式属于“直接法”,在课程的后半部分会讨论到。
从影像中提取同名点有存在两大挑战: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'}}} \]
鲁棒性体现在:
- 在积分前减去了 patch 内分子的平均值,对光照的定值增强 $I \rightarrow I + \gamma $ 鲁棒;
- 除以了 patch 的标准差,对光照的比例增强 \(I \rightarrow \gamma I\) 鲁棒。
【多视图几何】TUM 课程 第4章 同名点匹配的更多相关文章
- 【多视图几何】TUM 课程 第6章 多视图重建
课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 .视频评论区可以找到课 ...
- 【多视图几何】TUM 课程 第3章 透视投影
课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 .视频评论区可以找到课 ...
- 【多视图几何】TUM 课程 第5章 双视图重建:线性方法
课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 .视频评论区可以找到课 ...
- 【多视图几何】TUM 课程 第2章 刚体运动
课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 .视频评论区可以找到课 ...
- 【多视图几何】TUM 课程 第1章 数学基础:线性代数
在 YouTube 上找到了慕尼黑工业大学(Technische Universitaet München)计算机视觉组 Daniel Cremers 教授的 Multiple View Geomet ...
- javascript进阶课程--第三章--匿名函数和闭包
javascript进阶课程--第三章--匿名函数和闭包 一.总结 二.学习要点 掌握匿名函数和闭包的应用 三.匿名函数和闭包 匿名函数 没有函数名字的函数 单独的匿名函数是无法运行和调用的 可以把匿 ...
- C#入门到精通系列课程——第3章变量及运算符
◆本章内容 (1)变量是什么 (2)变量的声明及初始化 (3)常量 (4)运算符 (5)数据类型转换 (6)运算符优先级及结合性 (7)难点解答 ◆本章简述 很多人认为学习C#之前必须要学习C++,其 ...
- C#入门到精通系列课程——第2章编写C#程序
◆本章内容 (1)熟悉Visual Studio 2017开发环境 (2)编写第一个C#程序 (3)C#程序结构预览 (4)程序编写规范 (5)难点解答 ◆本章简述 要学习C#编程,必然要熟悉C#程序 ...
- C#入门到精通系列课程——第1章软件开发及C#简介
◆本章内容 (1)了解软件 (2)软件开发相关概念 (3)认识.NET Framework (4)C#语言 (5)Visual Studio 2017 ◆本章简述 软件在现代人们的日常生活中随处可见, ...
随机推荐
- 在MFC中显示图片(opencv Mat类型)
1,在MFC窗体中添加picture control控件,并添加对应的变量名 2,在窗体的初始化窗口中添加: namedWindow(); HWND hWnd = (HWND)cvGetWindowH ...
- Java并发编程之线程生命周期、守护线程、优先级、关闭和join、sleep、yield、interrupt
Java并发编程中,其中一个难点是对线程生命周期的理解,和多种线程控制方法.线程沟通方法的灵活运用.这些方法和概念之间彼此联系紧密,共同构成了Java并发编程基石之一. Java线程的生命周期 Jav ...
- Windows下python 3.0版本django的安装、配置、与启动
使用的环境是Windows操作系统,python的环境是3.6,django是官网上最新的版本1.10.6,本文介绍从安装python之后怎样用过pip管理工具安装django,以及django的项目 ...
- hbase 分页过滤(新老API的差别)
在hbase2.0以前分页过滤必须以上一次的最后一行+空字节数组作为下一次的起始行, 因为scan扫描的时候是包含起始行的,为了既能准确定位起始行,但又不重复把上一次的最末一行加入下一页, 所以,权威 ...
- variant conversion error for variable v23
excel数据导入到oracle数据库出现的问题 V23指的是excel列.,这列的数据长度超出或者类型与数据库表不一致导致的 解决方法,1.清空该列,再建个新列 2.用access SQL查出长度 ...
- MT【155】单调有界必有极限
(清华2017.4.29标准学术能力测试20) 已知数列$\{a_n\}$,其中$a_1=a$,$a_2=b$,$a_{n+2}=a_n-\dfrac 7{a_{n+1}}$,则_______ A.$ ...
- codevs2875RY哥查字典
题目链接:http://codevs.cn/problem/2875/ 题目描述 Description RY哥最近新买了一本字典,他十分高兴,因为这上面的单词都十分的和谐,他天天查字典. 输入描述 ...
- 【BZOJ4869】【SHOI2017】相逢是问候
Description BZOJ传送门 Solution 这题涉及到指数嵌套堆叠,可能可以用欧拉函数解决. 试想一个数\(a_i\)经过\(k\)次操作后会变成什么? \[ k个c\;\; \begi ...
- 在OpenShift上托管web.py应用
一.背景 最近在学习web.py,跟随官网的cookbook和code examples一路敲敲打打,在本地访问了无数遍http://0.0.0.0:8080/,也算是对web.py有了基本的认识.为 ...
- Centos Python3安装共存
安装python3.6可能使用的依赖 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlit ...