计算机视觉包含两个基本方向,物体识别和三维重建。图像识别的突破性进展源自于2012年卷积神经网络(CNN)的兴起。在此之前,计算机视觉的核心研究方向是三维重建。因为在当时,对于图像的特征提取主要是通过三维重建的方法来定义和实现的。自2012年以来,图像的特征便逐渐由神经网络来自动学习。
三维重建的应用是很广泛的,对于自动驾驶、VR、AR等应用领域应用来讲,三维重建是核心技术,并且实时三维重建是必然趋势,因为我们生活在三维空间里,必须将虚拟世界恢复到三维,我们才可以和环境进行交互。所以仅仅研究识别肯定是不够的,计算机视觉下一步必须走向三维重建,并且把三维重建和识别融为一体。
古建筑修复与重建是三维重建的一个具有代表性的应用,比如近期被烧毁的巴黎圣母院,如果通过三维模型网址进行数字重建,应该能够达到原汁原味还原其真实面貌的目的。目前在我们的三维重建项目中,名胜古迹的三维电子存档是很重要的一部分。从表面上看,三维重建似乎没有自动驾驶那么复杂,其实它比自动驾驶更难,因为自动驾驶的三维感知是给车识别,而VR、AR中的三维重建场景是提供给人类感知的,所以对三维重建的结果要求非常高。
总体来讲,三维重建是计算机视觉的灵魂。
先思考一个问题:用两个相机在不同的位置拍摄同一物体,如果两张照片中的景物有重叠的部分,我们有理由相信,这两张照片之间存在一定的对应关系,本节的任务就是如何描述它们之间的对应关系,描述工具是对极几何 ,它是研究立体视觉的重要数学方法。
直线CC’为基线,以该基线为轴存在一个平面束,该平面束与两幅图像平面相交,下图给出了该平面束的直观形象,可以看到,该平面束中不同平面与两幅图像相交于不同直线;
上图中的灰色平面[Math Processing Error],只是过基线的平面束中的一个平面(当然,该平面才是平面束中最重要的、也是我们要研究的平面);
对极几何相关的一个重要约束·5点共面约束
空间点X在两幅图像中的像分别为x和x’,这两个投影点之间存在的关系:
对极点(epipole):摄像机的基线与每幅图像的交点;即下图中的点e和e’(对极点=基线与像平面的交点=光心在另一幅图像中的投影)
对极线(epipolar line):对极平面与图像的交线;即下图中的直线l和l’(对极线=对极平面与像平面的交线)
对极平面(epipolar plane):任何包含基线的平面都称为对极平面,或者说是对极平面束中的平面;即下图中的平面就是一个对极平面
(对极平面=包含基线的平面)
问题:当只知道图像点x,那么它的对应点x’如何约束?
这里先说一下关于矩阵中的秩之前一直不是很理解,知乎上的解答:
「秩」是图像经过矩阵变换之后的空间维度
「秩」是列空间的维度
前者更直观,而后者是前者的原因
通过矩阵 [ 1 − 1 1 − 1 ] \begin{gathered} \begin{bmatrix} 1 & -1 \\ 1 & -1 \end{bmatrix} \end{gathered} [11−1−1]进行变换:
因此,此矩阵的「秩」为1
通过矩阵 [ 0 0 0 0 ] \begin{gathered} \begin{bmatrix} 0 & 0 \\ 0 & 0\end{bmatrix} \end{gathered} [0000] 进行变换:
因此,此矩阵的秩为0
所以,秩是图像经过矩阵变换之后的空间维度。
可以从另一维度来解释为什么
2 「秩」是列空间的维度
所以,列空间就是矩阵的列向量所能张成的空间(即能通过 a i ′ ⃗ + b j ′ ⃗ \vec{ai'}+\vec{bj'} ai′+bj′来表示)的空间
列空间的维度就是秩,旋转矩阵的列空间是二维的,所以秩就为2
那么这种定义方式怎么和之前说的秩是图像经过矩阵变换之后的空间维度联系起来呢?
2.3 两种定义方式的联系
用旋转矩阵对二维的正方形进行线性变换,实际上是一个二维空间到另外一个二维空间的变换:
对于矩阵 [ 1 − 1 1 − 1 ] \begin{gathered} \begin{bmatrix} 1 & -1 \\ 1 & -1 \end{bmatrix} \end{gathered} [11−1−1],他的列空间是一维的
因此,这个矩阵的秩就是1,用它对二维的正方形进行线性变换,实际上是一个二维空间到另外一个一维空间的变换:
同理,矩阵 [ 0 0 0 0 ] \begin{gathered} \begin{bmatrix} 0 &0 \\ 0 & 0\end{bmatrix} \end{gathered} [0000]的列空间是个点,因此它的「秩」就是0。
这里来自知乎:什么是矩阵的秩
基础矩阵可以用来:
1)简化匹配
2)去除错匹配特征
基础矩阵描述了空间中的点在2个像平面中的坐标对应关系
x ′ T F x = 0 \mathbf{x'}^\mathrm{T}Fx=0 x′TFx=0
什么是双目立体视觉(Binocular Stereo Vision):是机器视觉的一种重要形式,它是基于视差原理并利用成像设备从不同的位置获取被测物体的两幅图像,通过计算图像对应点间的位置偏差,来获取物体三维几何信息的方法。
基础矩阵F的应用
立体视觉几何中有以下问题:
1)已知一幅图像中一点,如何寻找另一幅图像中这个点的对应点(可用光流法、特征点匹配法)
2)已知两幅图像中两点是对应关系,如何求解两相机的相对位置和姿态【R|t】
3)已知多幅图像中同一3D点的对应点,如何求解该3D点的3D坐标
对极几何/基础矩阵 的出现可以解决问题2。即求出R|t.
给定一对同一场景不同视角得到的图像,对于第一幅图像上的任一像点x,在第二幅图像中都有一条与之对应的对极线l′,该对极线是像点x与过第一个相机中心C射线在第二幅图像上的投影,第二幅图像中与x相匹配的像点x′必定在该对极线上。因此,存在一个像点x到另一个图像上对极线l′的映射:x→l′
基础矩阵F表示的就是这种从点到直线的映射。
基础矩阵F的性质:
1)3*3且自由度为7的矩阵
2)F矩阵的秩为2
3)基本矩阵依赖内部和外部参数(Intrinsic and Extrinsic Parameters) (f, R & T)决定。
4)使用像素坐标系
自己对基本矩阵的理解:基本矩阵是很有用的一个工具,在三维重建和特征匹配上都可以用到。基本矩阵提供了三维点到二维的一个约束条件。举个例子,现在假设我们不知道空间点X的位置,只知道X在左边图上的投影x的坐标位置,也知道基本矩阵,首先我们知道的是X一定在射线Cx上,到底在哪一点是没法知道的,也就是X可能是Cx上的任意一点(也就是轨迹的意思),那么X在右图上的投影肯定也是一条直线。也就是说,如果我们知道一幅图像中的某一点和两幅图的基本矩阵,那么就能知道其对应的右图上的点一定是在一条直线上,这样就约束了两视角下的图像中的空间位置一定是有约束的,不是任意的。
于是VSLAM中相机的相对位姿可以通过特征点匹配估计出来:
1)提取两幅图像的特征点,并进行匹配
2)利用匹配得像点计算两视图的基础矩阵F
3 )从基础矩阵F中分解得到相机的旋转矩阵R和平移向量t
本质矩阵描述了空间中的点在两个坐标系中坐标对应关系
p ′ T E p = 0 \mathbf{p'}^\mathrm{T}Ep=0 p′TEp=0
本质矩阵E:E矩阵同样表示的是对极约束的关系,但它不再涉及相机内参,只由两视图之间的姿态关系决定。
1)描述空间中一点在不同帧之间的几何约束关系
2)注意这里的图像坐标是空间点在相机平面投影点的齐次坐标(摄像机坐标系下表示)
3)本质矩阵和相机外参有关系,和内参无关
本质矩阵E的性质:
1)3*3且自由度为5的矩阵
2)因为只包含R,t共有6个自由度,又因为尺度等价去掉一个自由度
3)本质矩阵E的奇异值必定为 [ σ , σ , 0 ] T [\sigma ,\sigma ,0]^{T} [σ,σ,0]T的形式
4)本质矩阵的秩为2
5)本质矩阵仅依赖外部参数(Extrinsic Parameters) (R & T)决定。
6) 使用摄像机(Camera)坐标系
自己对本质矩阵的理解:为了获取本质矩阵,首先计算基础矩阵F。(本质矩阵是基础矩阵的一个子集,不知道这样理解对不对?)根据本质矩阵E,就可恢复得到运动的状态R和T。
基本矩阵的方程定义:
x ′ − T F x = 0 \mathbf{x'}^\mathrm{-T}F_x=0 x′−TFx=0
其中 x x x与 x ′ x' x′是两幅图像的任意一堆匹配点。
由于每一组的匹配提供了计算 F F F系数的一个线性方程,当给定至少7个点,方程就可以计算出未知的方程。我们记点的坐标为 x = ( x ′ , y ′ , 1 ) T x=\mathbf{(x',y',1)}^\mathrm{T} x=(x′,y′,1)T, x ′ = ( x ′ , y ′ , 1 ) − T x'=\mathbf{(x',y',1)}^\mathrm{-T} x′=(x′,y′,1)−T,则对应的方程为
[ x y 1 ] [ f 11 f 12 f 13 f 21 f 22 f 23 f 31 f 32 f 33 ] [ x ′ y ′ 1 ] = 0 \begin{gathered} \begin{bmatrix} x&y&1\end{bmatrix} \end{gathered}\begin{gathered} \begin{bmatrix} f_{11}&f_{12}&f_{13}\\f_{21}&f_{22}&f_{23}\\f_{31}&f_{32}&f_{33}\end{bmatrix} \end{gathered}\begin{gathered} \begin{bmatrix} x'\\y'\\1\end{bmatrix} \end{gathered}=0 [xy1]⎣⎡f11f21f31f12f22f32f13f23f33⎦⎤⎣⎡x′y′1⎦⎤=0
展开后:
x x ′ f 11 + x ′ y f 12 + x ′ f 13 + y ′ x f 21 + y ′ y f 22 + y ′ f 23 + x f 31 + y f 32 + f 33 = 0 xx'f_{11}+x'yf_{12}+x'f_{13}+y'xf_{21}+y'yf_{22}+y'f_{23}+xf_{31}+yf_{32}+f_{33}=0 xx′f11+x′yf12+x′f13+y′xf21+y′yf22+y′f23+xf31+yf32+f33=0
把矩阵F写成列向量的有
[ x ′ x x ′ y x ′ y ′ x y ′ y y ′ x y 1 ] f = 0 \begin{gathered} \begin{bmatrix} x'x&x'y&x'&y'x&y'y&y'&x&y&1\end{bmatrix} \end{gathered}f=0 [x′xx′yx′y′xy′yy′xy1]f=0
给定n组合的几何,我们有如下方程:
A f = [ x ′ x x ′ y x ′ y ′ x y ′ y y ′ x y 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . x ′ x x ′ y x ′ y ′ x y ′ y y ′ x y 1 ] f = 0 Af=\begin{gathered} \begin{bmatrix} x'x&x'y&x'&y'x&y'y&y'&x&y&1\\...&...&...&...&...&...&...&...&...\\x'x&x'y&x'&y'x&y'y&y'&x&y&1\end{bmatrix} \end{gathered}f=0 Af=⎣⎡x′x...x′xx′y...x′yx′...x′y′x...y′xy′y...y′yy′...y′x...xy...y1...1⎦⎤f=0
如果存在确定(非零)解,则系数矩阵 A A A的自由度最多是8。由于 F F F是齐次矩阵,所以如果矩阵 A A A的自由度为8,则在差一个尺度因子的情况下解是唯一的。可以直接用线性算法解得。
八点算法:
两个步骤:
1)求线性解 :由系数矩阵A最小奇异值对应的奇异矢量f‘求的F
2)奇异性约束:是最小化 ∣ ∣ F − F ′ ∣ ∣ ||F-F'|| ∣∣F−F′∣∣的F’代替F
八点法概述:
如果由于点坐标存在噪声则矩阵 A A A的自由度可能大于8也就是等于9,由于 A A A是n*9的矩阵)。这时候就需要求最小二乘解,这里就可以用SVD来求解,f的解就是系数矩阵 A A A最小奇异值对应的奇异向量,也就是 A A A奇异值分解后$A=UD V T \mathbf{V}^\mathrm{T} VT 中矩阵 V V V的最后一列矢量,这是在解矢量 f f f在约束 ∥ f ∥ ∥f∥ ∥f∥下取 ∥ A f ∥ ∥Af∥ ∥Af∥最小解,以上算法是解矩阵的基本方法,称为8点算法。
由于基本矩阵有一个重要的特点就是奇异性
F矩阵的秩是2。如果基本矩阵是非奇异的,那么所计算的对极线将不重合。所以在上述算法解得基本矩阵后,会增加一个奇异性约束。最简便的方法就是修正上述算法中求得的矩阵 F F F。设最终的解为 ′ F ′ ′F' ′F′,令 d e t F ′ = 0 detF′=0 detF′=0下求得Frobenius范数(二范数) ∥ F − F ′ ∥ ∥F−F′∥ ∥F−F′∥最小的 F ′ F' F′ 。这种方法的实现还是使用了SVD分解,若 F = U D V T F=\mathbf{UDV}^\mathrm{T} F=UDVT,此时的对角矩阵 D = d i a g ( r , s , t ) D=diag(r,s,t) D=diag(r,s,t),满足 r > = s > = t r>=s>=t r>=s>=t,则 F ‘ = U d i a g ( r , s , 0 ) V T F‘=Udiag(r,s,0)\mathbf{V}^\mathrm{T} F‘=Udiag(r,s,0)VT最小化范数 ∣ ∣ F − F ′ ∣ ∣ ||F-F'|| ∣∣F−F′∣∣,也就是最终的解。
为了提高解的稳定性和精度,往往会对输入点集的坐标先进行归一化处理。
归一化八点算法:
1997年,Hartley对原始8点算法进行改进,在构造解的方程之前对输入的数据进行适当的归一化。即在形成8点算法的线性方程组之前,图像点的一个简单变换(平移或变尺度)将使这个问题的条件极大地改善,从而提高结果的稳定性。而且进行这种变换所增加的计算复杂性并不显著。算法具体过程具体如下:
1)对原始图象坐标做一个平移变换,使原来以左上角为原点的图象坐标变成以所有图像点的重心为原点的图像坐标;
2)再对图象坐标做一个尺度变换,使得点到原点的平均距离为 2 \sqrt{2} 2
分别对两幅图像进行以上两步变换,然后将变换后的图像坐标作为输入数据计算基础矩阵。
计算过程如下:
1)设两个独立的图像坐标变换分别为 T , T ′ T,T' T,T′则变换后的图像坐标为 x i ~ = T x i \widetilde{x_i}=Tx_i xi =Txi, x i ′ ~ = T x i ′ \widetilde{x_i'}=Tx_i' xi′ =Txi′
2)基于转换后的匹配点对 p − > p ′ p->p' p−>p′,利用八点算法计算基础矩阵 F ~ \widetilde{F} F
3)解除归一化,令 F = T T F ~ T F=\mathbf{T}^\mathrm{T}\widetilde{F}T F=TTF T,矩阵F是对应于原始数据 x i − > x i ′ x_i->x_i' xi−>xi′的基本矩阵。
注意:此时求得的F阵的秩并不保证严格为2。而且,由于噪声影响计算得到的F一般都是满秩的。
进而,根据相机的内参信息得到本质矩阵E。
SfM(Structure from motion) 是一种三维重建的方法,用于从motion中实现3D重建。也就是从时间系列的2D图像中推算3D信息。
人的大脑可以从动的物体中取得其三维的信息,是因为大脑在动的2D图像中找到了匹配的地方,即Corresponding area (points)。然后通过匹配点之间的视差得到相对的深度信息,在这一点上,原理和基于Stereo的三维重建相同。
SfM的输入是一段motion或者一时间系列的2D图群,不需要任何相机的信息。然后通过2D图之间的匹配可以推断出相机的各项参数。
小结
小结:
左相机: l = F T m ′ , F e = 0 l=\mathbf{F}^\mathrm{T}m',Fe=0 l=FTm′,Fe=0
右相机: l ′ = F m ′ , F T e ′ = 0 l'=Fm',\mathbf{F}^\mathrm{T}e'=0 l′=Fm′,FTe′=0
基础矩阵和极点,极线关系推导:
其中
l l l:左相机图像平面的极线
e e e:左相机图像平面的极点,左相机平面的所有极线都经过极点e
l ′ l' l′:右相机图像平面的极线
e / e/ e/:右相机图像平面的极点,右相机平面的所有极线都经过极点e‘
基础矩阵F满足下列等式:
( m ) ′ T F m = 0 \mathbf{(m)'}^\mathrm{T}Fm=0 (m)′TFm=0
m T F T m ’ = 0 \mathbf{m}^\mathrm{T}\mathbf{F}^\mathrm{T}m’=0 mTFTm’=0
对于左相机平面:
点m在极线l上,所以有 m T l = 0 \mathbf{m}^\mathrm{T}l=0 mTl=0,根据, m T F T m ’ = 0 \mathbf{m}^\mathrm{T}\mathbf{F}^\mathrm{T}m’=0 mTFTm’=0可知,相差一个常数因子时,对直线方程无影响,因此可以将极线l 表示为: l = F T m ’ l=\mathbf{F}^\mathrm{T}m’ l=FTm’
极点e在极线l上,所以有 e T l = e T F T m ′ = 0 \mathbf{e}^\mathrm{T}l=\mathbf{e}^\mathrm{T}\mathbf{F}^\mathrm{T}m'=0 eTl=eTFTm′=0因为左相机图像平面上的所有极线都过极点e,因此 m ′ m' m′可以为任意值,只能有
e T F T = ( F e ) T = 0 − > F e = 0 \mathbf{e}^\mathrm{T}\mathbf{F}^\mathrm{T}=\mathbf{(Fe)}^\mathrm{T}=0->Fe=0 eTFT=(Fe)T=0−>Fe=0
对于右相机平面:
点 m ’ m’ m’在极线 l ′ l' l′上,所以有 m ′ T l ′ = 0 \mathbf{m'}^\mathrm{T}l'=0 m′Tl′=0,根据, ( m ) ′ T F m = 0 \mathbf{(m)'}^\mathrm{T}Fm=0 (m)′TFm=0可知,相差一个常数因子时,对直线方程无影响,因此可以将极线l 表示为: l ′ = F m l'=Fm l′=Fm
极点 e ′ e' e′在极线 l ′ l' l′上,所以有 ( e ′ ) T l = ( e ′ ) T F m = 0 \mathbf{(e')}^\mathrm{T}l=\mathbf{(e')}^\mathrm{T}Fm=0 (e′)Tl=(e′)TFm=0因为右相机图像平面上的所有极线都过极点 e e e’,因此 m m m可以为任意值,只能有
( e ′ ) T F = ( F T e ′ ) T = 0 − > F T e ′ = 0 \mathbf{(e')}^\mathrm{T}F=\mathbf{(\mathbf{F}^\mathrm{T}e')}^\mathrm{T}=0->\mathbf{F}^\mathrm{T}e'=0 (e′)TF=(FTe′)T=0−>FTe′=0