SLAM入门之视觉里程计(3):两视图对极约束 基础矩阵
在上篇相机模型中介绍了图像的成像过程,场景中的三维点通过“小孔”映射到二维的图像平面,可以使用下面公式描述:
\[
x = MX
\]其中,\(c\)是图像中的像点,\(M\)是一个\(3\times4\)的相机矩阵,\(X\)是场景中的三维点。
通过小孔相机模型,可知假如从像点\(x\)向相机的中心\(C\)反投影一条射线\(\overrightarrow{xC}\),则该射线必定经过对应像点的三维空间点\(X\),但显然仅仅通过一个像点无法确定\(X\)的具体位置,因为在射线\(\overrightarrow{xC}\)上的任意空间点都可以通过“小孔”映射为像点\(x\)。一个像点不行,那么如果两个相匹配的像点呢?
设\(x'\)是三维点\(X\)的另一个像点,其对应相机的中心为\(C'\),那么从像点也反投影一条射线\(\overrightarrow{x'c'}\),并且该射线也必定经过\(X\),也就是说从一对相匹配的像点反投影两条射线,必定相交于空间三维点\(X\),如下图

很显然,一对匹配的像点之间存在这某种约束关系,这种约束被称为两视图的对极约束。
本文主要介绍了两视图的对极约束-基础矩阵,并用几何和代数两种形式推导基础矩阵的表达形式以及从基础矩阵可以分解出相机的位姿(旋转和平移)。
对极几何
对极几何描述的是两视图之间的内存射影关系,同一个三维点在两个不同的视角下的像点存在着约束关系,如下图三维点\(X\)在两幅图像的像点分分别为\(x,x'\)

对极几何主要涉及以下几个元素:
- 基线(Baseline),两个相机中心的连线\(CC'\)称为基线
- 对极点 epipolar ,\(e,e'\)是对极点,是基线和两个成像平面的交点,也就是两个相机在另一个成像平面的像点;\(e\)是右边的相机中心\(C'\)在左边相机的像点,同样\(e'\)是左边相机中心\(C\)在右边相机的像点。
- 对极平面 epipolar plane,任何过基线的平面都被才称为对极平面,两个相机的中心\(C\)和\(C'\),三维点\(X\),以及其在两个相机的像点\(x,x'\),这5点必定在同一个对极平面上。当三维点\(X\)变化时,对极平面绕着基线旋转,形成对极平面束。
- 对极线 epipolar line ,对极平面和成像平面的交线,所有的对极线相交于极点。
从上面的几何元素可知,对极几何和相机的内参、外参没有关系,和场景的结构也没有关系,仅和场景的一对匹配的像点有关系。
基础矩阵F
给定一对图像(同一场景不同视角得到的图像),从上面的图可知,对于第一幅图像上的任一像点\(x\),在第二幅图像中都有一条与之对应的对极线\(l'\),该对极线是像点\(x\)与过第一个相机中心\(C\)射线在第二幅图像上的投影,并且第二幅图像中与\(x\)相匹配的像点\(x'\)必定在该对极线上。因此,存在一个像点\(x\)到另一个图像上对极线\(l'\)的映射:
\[x \rightarrow l'\]
基础矩阵\(F\)表示的就是这种从点到直线的映射。
F的几何推导
该推导来自《计算机视觉中的多视图几何》。
要将一幅图像上的像点\(x\)映射到另一幅图像对应的对极线\(l'\)可以分为两步:第一步,将像点\(x\)映射到另一幅图像上与之对应的对极线\(l'\)上的某点\(x'\)上,\(x'\)是\(x\)的匹配点;第二步,连接对极点\(e'\)与点\(x'\)得到的直线就是对极线\(l'\)。
点通过平面转移 如下图,平面\(\pi\)不通过两相机中心,过第一个相机的中心\(C\)和像点\(x\)的射线与\(\pi\)相交于点\(X\)。该点\(X\)再投影到第二幅图像上得到像点\(x'\),这个过程称为点通过平面的转移。

点\(X\)位于像点\(x\)和相机中心确定的射线上,其在另一幅图像上的像点\(x'\)必然位于该射线在另一幅图像的投影也就是对极线\(l'\)上。点\(x\)和点\(x'\)都是三维点\(X\)的像点,这样第一副图像上的像点集合\(x_i\)和第二幅图像上的像点集合\(x'_i\)是射影等价的,它们都射影等价于共面的三维点集合\(X_i\)。因此,存在一个2D单应\(H_{\pi}\),把每一个点\(x\)映射到对应的点\(x'\)上。2D单应\(H_{\pi}\)指的是将射影平面上的点集\(x_i\)映射到另一个射影平面的点集\(x'_i\)上的射影变换,在实际情况中\(x_i\)和\(x'_i\)通常是两幅图像上的像点,每幅图像都被视为一个射影平面。
- 构造对极线 给点点\(x'\),通过\(x'\)和对极点\(e'\)的对极线\(l'\)可以表示为:\[l'=e'\times x'=[e']_{\times}\cdot x'\].
又由于\(x'=H_{\pi}x\)(\(H_{\pi}\)是将\(x\)变换为\(x'\)的单应),带入上式可得: \[l'=[e']_{\times}H_{\pi} x\]
定义\[F=[e']_{\times}H_{\pi}\]
这样就得到了从点\(x\)到对极线\(l'\)的变换\[l'=Fx\]
以上就是基础矩阵\(F\)的推导过程。 基础矩阵\(F\)可以记为:\(F=[e']_{\times}H_{\pi}\),其中\(H_{\pi}\)是一幅图像上像点到另一幅图像上的2D单应,\([e']_{\times}\)是对极点\(e'\)的反对称矩阵。由于\([e']_{\times}\)秩为2,\(H_{\pi}\)的秩为3,基础矩阵\(F\)的秩为2.
对极约束
由于\(l'=Fx\),而像点\(x'\)在对极线\(l'\)上,故可得到
\[
(x')^Tl'=(x')^TFx=0
\]
上式被称为对极约束,仅通过匹配的点对就可以求出两视图的基础矩阵\(F\)。
向量的叉积,反对称矩阵\([e']_{\times}\) 在射影几何中,一条直线有两点确定,如上面对极线有像点\(x'\)和对极点\(e'\)确定,并且可以表示为这两个点的叉积形式,有\(l'=e'\times x'\)。
设有两个向量\(\overrightarrow{a},\overrightarrow{b}\),则这两个向量的叉积仍然是一个向量,并且垂直于\(\overrightarrow{a},\overrightarrow{b}\)所在的平面。其坐标表示如下:
\[
\overrightarrow{a} \times \overrightarrow{b} =
\left[\begin{array}{ccc}0&-z_1&y_1\\z_1&0&-x_1\\-y_1&x_1&0\end{array}\right]
\left[\begin{array}{c}x_2\\y_2\\z_2\end{array}\right]=(\overrightarrow{a}_{\times})\cdot \overrightarrow{b}
\]
其中\(\overrightarrow{a}_{\times}\)称为向量\(\overrightarrow{a}\)的反对称矩阵
\[
\overrightarrow{a}_{\times}=\left[\begin{array}{ccc}0&-z_1&y_1\\z_1&0&-x_1\\-y_1&x_1&0\end{array}\right]
\]
通过引入反对称矩阵,向量的叉积可以使用矩阵乘法的表示,形式非常简洁。
F的代数推导
该推导来自《视觉SLAM十四讲》
设以第一个相机作为坐标系三维空间的点\(P=[X,Y,Z]\),其在两个相机的像点分别为\(p_1,p_2\)。由于第一个相机的中心作为世界坐标系的原点,也就是说第一个相机没有旋转和平移,通过小孔相机模型可得:
\[
p_1 = KP,p_2=K(RP+t)
\]
其中,\(K\)是相机的内参,\(R,t\)是第二个相机相对于第一个相机的旋转和平移。
从\(p_1 = KP\)可以得到\(P=K^{-1}p_1\),带入第二个式子可得到:
\[
p_2=K(RK^{-1}p_1 + t)
\]
两边同时左乘\(K^{-1}\),得到
\[
K^{-1}p_2=RK^{-1}p_1 + t
\]
设\(x_1=K^{-1}p_1,x_2=K^{-1}p_2\),代入
\[
x_2=Rx_1+t
\]
两边同时左乘向量\(t\)的反对称矩阵\(t_{\times}\),由于\(t_{\times}t=0\),消除\(t\)
\[
t_{\times}x_2=t_{\times}Rx_1
\]
两边再同时左乘\(x_2^T\)
\[
x_2^Tt_{\times}x_2=x_2^Tt_{\times}Rx_1
\]
由于\(t_{\times}x_2\)是向量\(t\)和向量\(x_2\)的叉积,同时垂直于向量\(t\)和向量\(x_2\),所以左边\(x_2^Tt_{\times}x_2=0\),得到
\[
x_2^Tt_{\times}Rx_1=0
\]
再将\(x_1,x_2\)换掉
\[
p_2^TK^{-T}t_{\times}RK^{-1}p_1=0
\]
上式是对极约束的另一种表示,该式子中仅包含像点,相机的旋转和平移,中间的矩阵就是基础矩阵\(F\)。
\[
p_2^TFp_1 = 0 , 其中 F=K^{-T}t_{\times}RK^{-1}
\]
式子\(F=K^{-T}t_{\times}RK^{-1}\),可知假如相机的内参数\(K\)是已知的,提取中间的矩阵可到
\[
E = t_{\times}R
\]
E被称为本质矩阵,其和基础矩阵相差相机的内参\(K\)。
通过匹配的点对计算相机的位姿
通过上面的知道,对于匹配的像点\(p_1,p_2\)以及基础矩阵\(F\)有如下关系:
\[
p_2^TFp_1 = 0 , 其中 F=K^{-T}t_{\times}RK^{-1}
\]
也就是说,仅通过匹配的点对(最少7对)可以计算出两视图的基础矩阵\(F\),然后再从\(F\)中分解得到相机的位姿势。
相机的相对位姿可以通过特征点匹配估计出来:
- 提取两幅图像的特征点,并进行匹配
- 利用匹配得像点计算两视图的基础矩阵\(F\)
- 从基础矩阵\(F\)中分解得到相机的选择矩阵\(R\)和平移向量\(t\)
SLAM入门之视觉里程计(3):两视图对极约束 基础矩阵的更多相关文章
- SLAM入门之视觉里程计(2):两视图对极约束 基础矩阵
在上篇相机模型中介绍了图像的成像过程,场景中的三维点通过"小孔"映射到二维的图像平面,可以使用下面公式描述: \[ x = MX \]其中,\(c\)是图像中的像点,\(M\)是一 ...
- SLAM入门之视觉里程计(5):单应矩阵
在之前的博文OpenCV,计算两幅图像的单应矩阵,介绍调用OpenCV中的函数,通过4对对应的点的坐标计算两个图像之间单应矩阵\(H\),然后调用射影变换函数,将一幅图像变换到另一幅图像的视角中.当时 ...
- SLAM入门之视觉里程计(2):相机模型(内参数,外参数)
相机成像的过程实际是将真实的三维空间中的三维点映射到成像平面(二维空间)过程,可以简单的使用小孔成像模型来描述该过程,以了解成像过程中三维空间到二位图像空间的变换过程. 本文包含两部分内容,首先介绍小 ...
- SLAM入门之视觉里程计(1):特征点的匹配
SLAM 主要分为两个部分:前端和后端,前端也就是视觉里程计(VO),它根据相邻图像的信息粗略的估计出相机的运动,给后端提供较好的初始值.VO的实现方法可以根据是否需要提取特征分为两类:基于特征点的方 ...
- SLAM入门之视觉里程计(6):相机标定 张正友经典标定法详解
想要从二维图像中获取到场景的三维信息,相机的内参数是必须的,在SLAM中,相机通常是提前标定好的.张正友于1998年在论文:"A Flexible New Technique fro Cam ...
- SLAM入门之视觉里程计(4):基础矩阵的估计
在上篇文章中,介绍了三位场景中的同一个三维点在不同视角下的像点存在着一种约束关系:对极约束,基础矩阵是这种约束关系的代数表示,并且这种约束关系独立与场景的结构,只依赖与相机的内参和外参(相对位姿).这 ...
- 第三篇 视觉里程计(VO)的初始化过程以及openvslam中的相关实现详解
视觉里程计(Visual Odometry, VO),通过使用相机提供的连续帧图像信息(以及局部地图,先不考虑)来估计相邻帧的相机运动,将这些相对运行转换为以第一帧为参考的位姿信息,就得到了相机载体( ...
- SLAM——视觉里程计(一)feature
从现在开始下面两篇文章来介绍SLAM中的视觉里程计(Visual Odometry).这个是我们正式进入SLAM工程的第一步,而之前介绍的更多的是一些基础理论.视觉里程计完成的事情是视觉里程计VO的目 ...
- 视觉slam十四讲个人理解(ch7视觉里程计1)
参考博文::https://blog.csdn.net/david_han008/article/details/53560736 https://blog.csdn.net/n66040927/ar ...
随机推荐
- INTERVAL YEAR TO MONTH数据类型
INTERVAL YEAR TO MONTH数据类型 Oracle语法: INTERVAL 'integer [- integer]' {YEAR | MONTH} [(precision)][TO ...
- VS2017离线安装入门与出家
重做系统,并且VS2017也发布有一段时间了,可以试试了. 于是网上搜了下,离线安装要下载他的安装工具. https://www.visualstudio.com/zh-hans/downloads/ ...
- Unity打包提示UnityEditor.BuildPlayerWindow+BuildMethodException: Build failed with errors.错误
不要将打包的输出路径设置为Assets文件夹下面即可,MD真坑 老外给出的解释: As you have noticed after you click build settings you are ...
- 使用koa2+es6/7打造高质量Restful API
前言 如今nodejs变得越来越火热,采用nodejs实现前后端分离架构已被多数大公司所采用. 在过去,使用nodejs大家首先想到的是TJ大神写的express.js,而发展到如今,更轻量,性能更好 ...
- vscode配置git及码云
1.将代码放到码云 到码云里新建一个仓库,完成后码云会有一个命令教程按上面的来就行了 码云中的使用教程: Git 全局设置: git config --global user.name "A ...
- python基础自学 第四天
break和continue break:某一条件满足,退出循环,不在执行后续重复代码 continue:某一条件满足时,不执行后续重复的代码 注意:在循环中,如果使用continue这个关键字,使用 ...
- Web browser发展演变
浏览器是指可以显示网页服务器或者文件系统的HTML文件内容,并让用户与这些文件交互的一种软件.网页浏览器主要通过HTTP协议与网页服务器交互并获取网页,这些网页由URL指定,文件格式通常为HTML.大 ...
- Visual Studio 2017 集成Crystal Report为ASP.NET MVC呈现报表
最近项目需要实现报表功能,平衡各方面的因素,还是使用Crystal Report(水晶报表) 下载较新版本: http://downloads.businessobjects.com/akdlm/cr ...
- 背水一战 Windows 10 (97) - 选取器: CachedFileUpdater
[源码下载] 背水一战 Windows 10 (97) - 选取器: CachedFileUpdater 作者:webabcd 介绍背水一战 Windows 10 之 选取器 CachedFileUp ...
- ZJOI2019一试游记
ZJOI2019一试游记 Day -2 早上颓刀剑,中午赶动车,写一会儿作业,下午赶车到酒店,发现跟杭二的巨佬一个酒店qwq 本来想测试一下我在人群中大叫一声ljc1301 AK ZJOI2019会有 ...