知乎上面的大牛还是很多,直接搜Homography或者单应矩阵就能得到很多大神的回答,可能回答中的一句话或者一个链接就够自己学习很久。
其实在之前研究双目视觉的时候就接触了对极几何,通过视觉就可以得到物体的远近信息,这也是特斯拉等自动驾驶甚至可以完全使用摄像头而不使用雷达的原因。
通过下面这幅图说明一下匹配点必须在极线上。在单镜头下,同一个径向的物体P、Q的成像是重合的,所以我们无法判断物体的前后远近关系,在双目视觉中,利用两个镜头对同一场景进行捕捉,相当于换了一个视角观察,或者说引入了镜头相对位置这个先验信息,从而可以利用两个镜头分别捕捉的图像进行信息融合。这时问题的关键就是在两幅图像之间找到对应点。我们当然可以使用SIFT等特征点描述子进行匹配,但是,对极几何利用极平面的特殊性质将对应点约束在另外一幅图像的极线上,将搜索范围从2D减少到1D。
本质矩阵
刚才提到我们引入了镜头相对位置的先验信息,两个镜头对于彼此的位置是已知的(通过极点),那么这种相对位置在数学上是怎么表示的呢?其实这就是基础矩阵。最基本的空间变换是平移和旋转,本质矩阵Essential Matrix就包含了旋转R和平移T,因为只是镜头相对位置,所以不包含相机焦距等内参。本质矩阵的推导主要利用的是三个红色的向量在极平面内共面,即三个向量混合积(点乘和叉乘)为0,使用的坐标系是相机坐标系。
叉乘(向量的外积),结果还是一个向量,新的向量c垂直于向量a和b,按照右手螺旋法则,长度是a和b张开的平行四边形的面积。相机坐标系是以相机的镜头(光心)为原点,z轴为镜头的径向,和成像平面垂直。
将圆括号中的叉乘改写成矩阵形式,最后可以得到
本质矩阵的求解和其中旋转和平移矩阵的求解。矩阵是3x3大小的,需要8个点来求解。
基础矩阵
刚才的本质矩阵是在对应点在相机坐标系下的对应关系,而我们更关心的是成像,即对应点在图像物理坐标系(也叫平面坐标系)下的对应关系。图像物理坐标系大致和相机坐标系一样,但是原点移到了成像面上,为光轴与成像平面的交点。
相机坐标系到图像物理坐标系之间的转换:
图像物理坐标系和我们日常在计算机进行数字图像处理所使用的坐标系依然不一样,前者是以m为单位的,表示的是成像时距离原点的绝对长度,而我们通常使用的是像素坐标系。像素坐标系以像素为单位,如图像大小为255x255,表示这个图像长宽都是255个像素。像素坐标系的原点选在图像左上角,x轴为水平向右。OpenCV、OpenGL等库的坐标系即和图像坐标系一致。当然明显看出CCD传感器以mm单位到像素中间有转换的。举个例子,CCD传感上上面的8mm x 6mm,转换到像素大小是640x480. 假如dx表示像素坐标系中每个像素的物理大小就是1/80. 也就是说毫米与像素点的之间关系是piexl/mm.
OpenCV中函数findFundamentalMat可以找到基础矩阵Fundamental matrix。
单应性矩阵Homography matrix
之前的对极几何中两个视图中点的对应关系是点对应直线(极线),而单应矩阵是点对应另外一幅视图中的点,约束力更强。
H矩阵的推导,来自相机在不同位姿拍摄同一个三维平面。之所以H矩阵约束力更强,是它不仅仅引入了两个镜头之间的旋转和平移变换,还包含了景深信息d。
通过相机位置坐标在法向量方向的投影(乘转置)表示景深距离d。
两个相机之间的位置包含了平移和旋转,他们之间的关系可以用等式来表示:
如果研究的对象是相机像素坐标,应该有内参矩阵K的参与,对应的单应矩阵为:
注意这里的单应矩阵中包含了三大信息,旋转矩阵R,平移矩阵T,景深信息d。R和T描述两个相机之间的关系,所以是唯一确定的,而d是两个相机所捕获的平面上点到其中一个相机的距离,为了用单应矩阵描述两幅视图中像素点的对应关系,这个d应该保持一致,即相机所捕获的场景应该是平面,且是垂直于相机1法向量的平面。
特别的,在纯旋转情况下,两个相机之间没有平移关系T,即
这样单应矩阵H就退化为H=R,H中不再包含d,所以就可以摆脱拍摄景物必须在同一平面的限制。而我们通常无法获得景深信息d,所以这也让我们不必再求解d。换一种思路,即便相机之间存在平移,但是当景物在无穷远处时,d可以认为无穷大,也可以将H中的第二项舍去,此时的H叫做Infinite Homography。这给我们的启发或者说解释就是,在使用相机拍摄全景图时,最好保证相机只在原地旋转,没有平移运动,或者拍摄的景物是远景,可以看作d是无穷大。
那么,当实在无法满足上述条件,即有平移,且无法保证共面,这种情况下不同的点的参数d不一样,但是单应矩阵只能选择一个d,肯定会出现误差。当相机的平移向量相对于场景深度而言足够小时,可以使用RANSAC找到一个满足大部分点的矩阵,误差是可以接受的,这应该就是orbslam中提到的低视差情形。
单应矩阵的本质
单应矩阵的本质是利用了平面信息(平面法向量n和相机到平面的距离d),建立起像素坐标到相机系坐标的关系。推导过程如下:
像素系齐次坐标
原理上可由齐次坐标得到相机坐标系下的坐标:,K是相机内参,K一般是已知的,现在问题是深度z未知。而如果我们除了知道p的点坐标,还知道它所在平面的信息,就可以求出z。
p所在平面的法向量是n,p所在平面到相机的距离d,那么,将代入,得到
最后,参考链接还总结了单应矩阵和对极几何的关系。所谓的“六点法”,四个共面点确定H,两个非共面点确定极点。极点确定了,H也知道,那么其他任意点的极线就能画出来了,不用本征矩阵我们也可以构造极线几何。
而在计算本质矩阵中,又必须满足8点不能共面。这是因为共面的话求解E会有无穷多个解满足方程,所以8点法求解不能适用于共面的情况。
这篇博客连同上一篇研究了图像变换和单应矩阵、本质矩阵。其实在学习线性代数和矩阵论时就应该认识到,矩阵不仅能表示状态,还可以表示运动。真实世界中的物体在不同的成像条件下(特指相机的位置不同,两个相机之间存在旋转和平移),会得到不同的图像,这些图像之间可以认为存在仿射变换或者透视变换,如果用矩阵来描述就可以使用单应矩阵或者本质矩阵。其实单应矩阵适用于相机发生了旋转的平面场景(或者近似平面场景),应用的限制性和对点的限制性(点到点)都更强;本质矩阵和基础矩阵适用范围更广,它们都包含了相机之间的旋转和平移信息,其中基础矩阵更常用,因为它具体描述的是两个相机得到的图像的像素级之间的关系,而本质矩阵只描述了两个相机之间的关系,换一句话说,基础矩阵相比于本质矩阵,不仅包含两个相机之间的旋转平移信息,还包含了相机内参。相机内参就包括了镜头焦距、像素大小等信息,这就涉及到相机标定,可以通过一个仿射矩阵表示。不过在理论上通过四对匹配点对就可以计算得到,而OpenCV的一个函数就可以实现。
Reference:
1.知多少https://blog.csdn.net/heyijia0327/article/details/53782094
2.坐标系https://blog.csdn.net/lyl771857509/article/details/79633412
3.庖丁解牛侯凯https://www.cnblogs.com/houkai/p/6661607.html
4.葵花宝典https://link.zhihu.com/?target=http%3A//www.robots.ox.ac.uk/%7Evgg/hzbook/
5.一分钟:https://blog.csdn.net/Yong_Qi2015/article/details/82858582