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 ...
随机推荐
- python中3个连续的单引号是什么意思?''' ... ''' 这样的引号是什么意思?
- 预装win8的笔记本用第三方分区软件分区后出现0x0000225错误的解决方法/同理win7
最近为采用EFI分区的联想电脑分区,是通过第三方软件进行的,完成后重启,发现系统报错0x0000225,提示插入安装介质修复. 应该是EFI分区导致的 http://zhidao.baidu.com/ ...
- python pandas.DataFrame.append
1.使用append首先要注意的是,你要合并两个DataFrame的columns即列名是否是相同的,不相同的就会报错. 2.我们会发现DataFrame的列名是不能够重复的,而行名(index)是可 ...
- liunx_second_day
liunx-基本权限 1.文件和目录权限的区别 A.文件的权限:所有者,所属组,其他人 rwx,读,写,执行,没有权限就是- 第一组rwx:文件所有者的权限 第二组rwx:文件所属组的权限 第三组rw ...
- shell脚本颜色输出(实例未编辑)
颜色输出通过echo 输出,需要加-e echo -e "\033[背景颜色;字体颜色\033[0m" 背景颜色 40 设置黑色背景 41 设置红色背景 42 设置绿色背景 43 ...
- ubuntu+apache2设置访问、重定向到https
环境:ubunt14裸机,apache2,php5 条件:证书(部分商家买域名送一年),域名,为了方便均在root用户下进行的 web目录:/var/www/test 证书目录(自建):/etc/ap ...
- FPGA中带优先级的if else if与不带优先级的case的探讨
我们知道在书本上都说让我们尽量使用不带优先级的的数据选择器,今天我们就来探讨一下二者的区别. 例子1:带优先级的的数据选择器,综合成功,且没有任何警告. module detection_prio # ...
- [编译] 2、minGW gcc在windows搭建编译win32程序环境
1.普通下载一个MinGW程序.安装之后可以直接将MinGW目录拷贝到总工程的tool里面: demo_mesh_common tree -L 2 . ├── app ├── bin ├── buil ...
- VSCode插件开发全攻略(七)WebView
更多文章请戳VSCode插件开发全攻略系列目录导航. 什么是Webview 大家都知道,整个VSCode编辑器就是一张大的网页,其实,我们还可以在Visual Studio Code中创建完全自定义的 ...
- fescar分布式事务(概览)
1. fescar分布式事务(概览) 1.1. 概述 Fescar 是 阿里巴巴 开源的 分布式事务中间件,以 高效 并且对业务0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题. 1.2 ...