双目立体视觉几何框架详解
一、图像坐标系:世界坐标系
(1)图像坐标和世界坐标(A)
视觉系统的三大坐标系:世界坐标系,摄像机坐标系和图像坐标系。
世界坐标系(XW,YW,ZW):其是目标物体位置的参考系。除了无穷远,世界坐标可以根据运算方便与否自由放置。在双目视觉中世界坐标系主要有三个用途:1、标定时确定标定物的位置2、作为双目视觉的系统参考系,给出两个摄像机相对世界坐标系的关系,从而求出相机之间的相对关系3、作为重建得到三维坐标的容器,盛放重建后的物体的三维坐标。世界坐标系是将看见中物体纳入运算的第一站。
摄像机坐标系(XC,YC,ZC):其是摄像机站在自己角度上衡量的物体的坐标系。摄像机坐标系的原点在摄像机的光心上,z轴与摄像机光轴平行。它是与拍摄物体发生联系的桥头堡,世界坐标系下的物体需先经历刚体变化转到摄像机坐标系(旋转和平移),然后再和图像坐标系发生关系。它是图像坐标与世界坐标之间发生关系的纽带,沟通了世界上最远的距离。
图像坐标系(x,y)米/(u,v)像素 :其是以摄像机拍摄的二维照片为基准建立的坐标系。用于指定物体在照片中的位置。可以将(x,y)称为连续图像坐标或空间图像坐标,将(u,v)称为离散图像坐标系或者是像素图像坐标系(虽然这样的称呼未经考证,但更能传达二者的物理意义)。
(x,y)坐标系的原点位于摄像机光轴与成像平面的交点O’(u0,v0)上,单位为长度单位(米)。(u,v)坐标系的原点在图片的左上角(其实是存储器的首地址),单位为数量单位(个)。(x,y)主要用于表征物体从摄像机坐标系向图像坐标系的透视投影关系。而(u,v)则是实实在在的,我们能从摄像机中得到的真实信息。
(x,y)与(u,v)存在如下转换关系:
dx代表x轴方向一个像素的宽度,dy代表y轴方向上一个像素的宽度。dx、dy为摄像机的内参数。(u0,v0)称为图像平面的主点,也是摄像机的内参数。其实相当于对x轴和y轴的离散化。其可以运用齐次坐标,将上式写成矩阵形式,如下:
(1)式运用了齐次坐标,将普通坐标转换为齐次坐标,通常就是在增加一个维度,这个维度上的数值为1。如图像坐标系(u,v)转换为(u,v,1)一样。对于无穷远点,小尾巴为0。注意,给零向量增加小尾巴,数学上无意义。
(2)图像坐标和世界坐标(B)
刚体变换(regidbody motion):三维空间中, 当物体不发生形变时,对一个几何物体作旋转, 平移的运动,称之为刚体变换。
因为世界坐标系和摄像机坐标都是右手坐标系,所以其不会发生形变。我们想把世界坐标系下的坐标转换到摄像机坐标下的坐标,如下图所示,可以通过刚体变换的方式。空间中一个坐标系,总可以通过刚体变换转换到另外一个个坐标系的。经过平移旋转就可以转到另一个坐标系了。
二者之间刚体变化的数学表达式为:
其中,XC代表摄像机坐标系,X代表世界坐标系。R代表旋转,T代表平移。R、T与摄像机无关,所以称这两个参数为摄像机的外参数(extrinsic parameter)可以理解为两个坐标原点之间的距离,因其受x,y,z三个方向上的分量共同控制,所以其具有三个自由度。
R则为分别绕XYZ三轴旋转的效果之和。如下面所示:
R=r1*r2*r3.其由三个方向的θ控制,故具有三个自由度。
接下来,让我们看看摄像机坐标下的坐标如何投影到图像坐标系下,最终变为照片中的一个像素。这其中包含两个过程:一是从摄像机坐标到“空间图像坐标”(x,y)所发生的透视投影;二是从“连续图像坐标”到“离散图像坐标”(u,v)。后者我们已经在第一篇博文中解释过。所以在这里,主要介绍一下透视投影。
透视投影(perspective projection): 用中心投影法将形体投射到投影面上,从而获得的一种较为接近视觉效果的单面投影图。有一点像皮影戏。它符合人们心理习惯,即离视点近的物体大,离视点远的物体小,不平行于成像平面的平行线会相交于消隐点(vanish point)。
示意图如下图所示:
以图中B(XB,YB)点为例,在小孔成像摄像机模型下(几何分析的最常用模型)。这里的f为摄像机的焦距,其属于摄像机的内参数(intrinsic parameter)。其在成像平面上的投影点b(xb,yb)的坐标利用简单的相似三角形比例关系很容易求出:
上面两式阐明了摄像机坐标与图像坐标之间的透视投影关系。
接下来用一张图把三个过程连接起来。实现从世界坐标(X,Y,Z)到(u,v)之间的转换。让图像坐标与世界坐标直接对话。
将三者相乘,可以把这三个过程和在一起,写成一个矩阵:
P就是世界坐标到图像坐标的直接联系人,P就表示了一个投影相机,有下面公式:
注意在表示齐次坐标时,需要在符号上面加个小帽子。除去齐次坐标控制位P23,P具有11个自由度。
二、张正友标定
标定在整个基于标定摄像机的三维重建的几何过程占有最重要最核心的地位。如下图:
从图中明显可以看出,标定得到的内参、外参和畸变系数,是双目视觉进行图片矫正,摄像机校正和3D恢复的基础。没有好的标定,双目视觉系统就无法完成3D重建。
具体的张氏标定顺序讲解:
1、标定平面到图像平面的单应性
因为张氏标定是一种基于平面棋盘格的标定,所以想要搞懂张氏标定,首先应该从两个平面的单应性(homography)映射开始着手。
单应性(homography):在计算机视觉中被定义为一个平面到另一个平面的投影映射。首先看一下,图像平面与标定物棋盘格平面的单应性。
由上面博文中讲到的摄像机模型,肯容易得到:
其中m的齐次坐标表示图像平面的像素坐标(u,v,1),M的齐次坐标表示世界坐标系的坐标点(X,Y,Z,1)。A[R t]即是上面推出的P。R表示旋转矩阵、t表示平移矩阵、S表示尺度因子。A表示摄像机的内参数,具体表达式如下:
α=f/dx,β=f/dy,因为像素不是规规矩矩的正方形,γ代表像素点在x,y方向上尺度的偏差。
这里还有一个“梗儿”,就是S。它只是为了方便运算,对于齐次坐标,尺度因子不会改变坐标值的。
因为标定物是平面,所以我们可以把世界坐标系构造在Z=0的平面上。然后进行单应性计算。令Z=0可以将上式转换为如下形式:
既然,此变化属于单应性变化。那么我们可以给A[r1 r2 t]一个名字:单应性矩阵。并记H= A[r1 r2 t]。
那么现在就有:
大家可以分析一下,H是一个三3*3的矩阵,并且有一个元素是作为齐次坐标。因此,H有8个未知量待解。
(x,y)作为标定物的坐标,可以由设计者人为控制,是已知量。(u,v)是像素坐标,我们可以直接通过摄像机获得。对于一组对应的(x,y)-à(u,v)我们可以获得两组方程。
现在有8个未知量需要求解,所以我们至少需要八个方程。所以需要四个对应点。四点即可算出,图像平面到世界平面的单应性矩阵H。
这也是张氏标定采用四个角点的棋盘格作为标定物的一个原因。
在这里,我们可以将单应性矩阵写成三个列向量的形式,即:
2、利用约束条件求解内参矩阵A
从上面可知,应用4个点我们可以获得单应性矩阵H。但是,H是内参阵和外参阵的合体。我们想要最终分别获得内参和外参。所以需要想个办法,先把内参求出来。然后外参也就随之解出了。我们可以仔细的“观摩”一下下面的式子。
从中可以得出下面两个约束条件,这两个约束条件都是围绕着旋转向量来的。
1、r1,r2正交 得:r1r2=0。这个很容易理解,因为r1,r2分别是绕x,y轴旋转的。应用高中立体几何中的两垂直平面上(两个旋转向量分别位于y-z和x-z平面)直线的垂直关系即可轻松推出。
2、旋转向量的模为1,即|r1|=|r2|=1。这个也很容易理解,因为旋转不改变尺度嘛。如果不信可以回到上一篇博客,找到个方向的旋转矩阵化行列式算一下。
通过上面的式子可以将r1,r2代换为h1,h2与A的组合进行表达。即 r1=h1A-1,r2=h2A-1.根据两约束条件,可以得到下面两个式子:
大家从上面两个式子是不是看出一点端倪了。式子中,h1,h2是通过单应性求解出来的那么未知量就仅仅剩下,内参矩阵A了。内参阵A包含5个参数:α,β,u0,v0,γ。那么如果我们想完全解出这五个未知量,则需要3个单应性矩阵。3个单应性矩阵在2个约束下可以产生6个方程。这样可以解出全部的五个内参了。大家想一下,我们怎样才能获得三个不同的单应性矩阵呢?答案就是,用三幅标定物平面的照片。我们可以通过改变摄像机与标定板间的相对位置来获得三张不同的照片。(当然也可以用两张照片,但这样的话就要舍弃掉一个内参了γ=0)
到这里,大家应该就明白我们在张氏标定法时为什么要不断变换标定板的方位了吧。当然这只是一个原因。第二个原因,玉米会在讲极大似然时讲到。
下面在对我们得到的方程做一些数学上的变化,这些变化都是简单的运算变化了,相信大家动动笔,一算就可以算出。这些变化都是为了运算方便的,所以也没什么物理意义。
首先令:
很容易发现B是一个对称阵,所以B的有效元素只剩下六个(因为有三对对称的元素是相等的,所以只要解得下面的6个元素就可以得到完整的B了),让这六个元素构成向量b。
接下来在做一步纯数学化简:
可以计算得:
利用约束条件可以得到下面,方程组:
这个方程组的本质和前面那两个用h和A组成的约束条件方程组是一样的。在此重复一遍解释:如果我们想完全解出这五个未知量,则需要3个单应性矩阵。3个单应性矩阵在2个约束下可以产生6个方程。这样可以解出全部的五个内参了。大家想一下,我们怎样才能获得三个不同的单应性矩阵呢?答案就是,用三幅标定物平面的照片。我们可以通过改变摄像机与标定板间的相对位置来获得三张不同的照片。(当然也可以用两张照片,但这样的话就要舍弃掉一个内参了γ=0)
通过至少含一个棋盘格的三幅图像,应用上述公式我们就可以估算出B了。得到B后,我们通过cholesky分解 ,就可以轻松地得到摄像机的内参阵A。
3、基于内参阵估算外参阵
通过上面的运算,我们已经获得了摄像机的内参阵。那么对于外参阵,我们很容易通过下面的公式解得:
对上面公式进行化简,可以得到:
4、小结
一、张氏标定的过程
1. 打印一张棋盘格,把它贴在一个平面上,作为标定物。
2. 通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片。
3. 从照片中提取特征点(如角点)。
4. 估算理想无畸变的情况下,五个内参和所有外参。
5. 应用最小二乘法估算。实际存在径向畸变下的畸变系数。
6. 极大似然法,优化估计,提升估计精度。
通过这样的过程,我们就获得了具有高估计精度的五个内参,三个外参和两个畸变系数。利用这些信息,我们可以进行畸变矫正、图像校正和最终的三维信息恢复。
二、以下是对于张氏标定求得的内参,需要注意的一点:
通过张氏标定,我们并不能得到:焦距(f)和像素的物理尺寸(sx,sy)两个参数。因为我们在求解内参阵A时,求解出的是α和β。
α=f/ sx,β= f/ sy 。分别代表焦距长度上,x轴和y轴像素的个数。
虽然,没有求得焦距,但这并不影响,我们在三维坐标恢复时,进行三角运算。因为彼时,我们的计算中用到的也是α和β。
大家可能会有疑问,既然我们无法得到焦距(f)和像素的物理尺寸(sx,sy)两个参数。那么在opencv中,调用的cvCalibrateCamera2时返回的参数中是包含焦距(f)的。Opencv的这个函数也是用了张氏标定法。为什么可以得到f呢?
答案是这条opencv函数对内参阵做了简化,其认为γ=0即像素的物理尺寸(sx,sy)两个参数相等。然后统一约掉物理尺寸s。得到的B阵如下:
这样我们就可以解出f了。
张氏标定的精确度可达到0.5个像素,这样的指标已经可以满足绝大多数的应用了。所以如此简单的方法,得到了这么高的精度。这样的方法是值得人们膜拜的。在此,在次向张正友教授致敬!
三、立体标定与立体校正
那么,想要知道视差,首先应该知道双目视觉系统中两个摄像头之间的相对位置关系。我们可以通过同时对两个摄像头进行标定,分别得到二者相对同一坐标系的旋转矩阵和平移矩阵。获得这两个矩阵的过程,就是立体标定的过程。也即是:从张氏标定走向立体标定!
两摄像头之间的旋转矩阵和平移矩阵可以由下式求出:
其中,R为两摄像头间的旋转矩阵,T为两摄像头间的平移矩阵。Rr为右摄像头经过张氏标定得到的相对标定物的旋转矩阵,Tr为右摄像头通过张氏标定得到的相对标定物的平移向量。Rl为左摄像头经过张氏标定得到的相对相同标定物的旋转矩阵,Tl为左摄像头经过张氏标定得到的相对相同标定物的平移向量。
对于R,首先用T把左摄像机坐标系平移到右摄像机坐标系上(即两坐标系远点重合)。然后在同一参考系下的两个旋转矩阵相乘,表示世界坐标先向右旋转到Rr ,再向左旋转Rl。那么两次旋转后得到的旋转,就是有摄像机旋转到左摄像机所需的旋转矩阵R。
对于T,那就更容易理解了,先用R对左坐标系旋转一下,把左右两摄像机调成平行,然后直接平移向量相减,即得到。两摄像机之间的平移向量T。
立体校正
因为当两个图像平面是完全共面行对准时,计算立体视差是最简单的。但是,在现实的双目立体视觉系统中,是不存在完全的共面行对准的两个摄像机图像平面的。所以我们要进行立体校正。立体校正的目的就是,把实际中非共面行对准的两幅图像,校正成共面行对准。如下面示意图所示。(共面行对准是指:两摄像机图像平面在同一平面上,且同一点投影到两个摄像机图像平面时,应该在两个像素坐标系的同一行)
有了上述铺垫,下面让玉米给大家陈述一下基于立体标定所获参数的立体校正的数学原理,或者说是几何原理。但玉米在这里,主要和大家分享一下,如此校正的物理意义。
立体校正应该分两步走:
1、 将两个图像平面拉回同一平面。
这一步,该怎么做呢?玉米相信,经过这么多铺垫,大家应该早就心里有数了。这一步很简单。可以这样:两个平面在方向上 之间不是相差一个旋转矩阵R吗,那么我们让两个相机个旋转一半,但需注意二者的旋转,应该是反向的。如下式所示:
rl 、rr 分别代表左摄像机和右摄像机为达到共面所需的旋转矩阵。rl、rr程度 相同,但旋转方向相反。左右相机分别经历了这样的旋转之后,二者就已经共面了。
2、 旋转图像使得同行对准
玉米在这里先为大家展示一个,校正成功的图吧。
左右两图分别绕光轴作了旋转,旋转过后两摄像机的主点连线平行像素坐标的行线。
红色的线表示的是校正后的行线,其是左右对准的。大家可以看到,从原图像的行线转到校正后图像的行线,左图像转动了α,右图像转动了θ。那么怎样来确定两个旋转角度呢?
大家可以回忆一下,我们在本系列博文中的第二篇中讲述刚体变换时,把旋转矩阵按不同轴分解的方法。可以看做是沿光轴旋转,旋转目的是与主点连线平行。先以左图像为例:
那么我们设旋转矩阵为Rh ,
则Rh可以表示为以归一化T(平移向量):e1为旋转的指针,则随之e2为e1与光轴的叉积,e3为e2与e1的叉积:
大家可以进一步算一下:
我们发现,其实行对准就是绕e3方向,转了α。同样的,对右图就是转了θ。
通过上面的推导,我们就把立体标定与立体校正中的数学思想理清楚了。其实,立体匹配是有很多种方法的,玉米在里只是介绍了立体校正的基本原理。其他方法中,有一些可以不依赖标定参数,如果大家想要对立体校正进行深入研究,大家可以搜索一些经典论文进行深入学习。如:A. Fusiello, E. Trucco, and A. Verri.写的 Acompact algorithm for rectification of stereo pairs.等等
截止目前对于三维重建的所有准备工作,都已完成。几何框架也仅剩下最后一步:立体成像。(因为本系列博文只介绍双目视觉的几何架构,所以跳过匹配不谈)玉米在下一篇博文中将与大家分享一下,几何脉络的最终果实:立体成像。这也是我们对于双目视觉几何框架推导和理解的最终目标。
四、三维
只看在几何上,三维坐标是如何被还原的。相对来说,最后的这一步,比前面是要轻松许多的,因为我们前面已经做了大量的工作。
此处我们按opencv中cvcalibratecamera2()函数得到的焦距f进行三维坐标的求解。
请大家看下面示意图:
根据最简单的相似三角形关系,我们就可以求出,物点坐标(X,Y,Z)。
首先,
其中,s为像素的物理尺寸,d就是两个摄像机间的视差,d=(uL-uR)s。
我们得到的这个三维坐标,相当于是在右摄像机的摄像机坐标系上的。
那么重建就是透视投影的逆过程,我们可以把这个过程表示成矩阵形式。我们定义Q为反投影矩阵。那么依照上式:
齐次坐标形式的三维坐标恢复,矩阵形式如下:
双目立体视觉几何框架详解相关推荐
- 双目视觉几何框架详解(玉米专栏8篇汇总)
一.图像坐标:我想和世界坐标谈谈(A) 玉米竭力用轻松具体的描述来讲述双目三维重建中的一些数学问题.希望这样的方式让大家以一个轻松的心态阅读玉米的<计算机视觉学习笔记>双目视觉数学架构系列 ...
- 双目视觉集合框架详解
双目视觉几何框架详解 一.图像坐标:我想和世界坐标谈谈(A) 玉米竭力用轻松具体的描述来讲述双目三维重建中的一些数学问题.希望这样的方式让大家以一个轻松的心态阅读玉米的<计算机视觉学习笔记> ...
- jQuery Validate验证框架详解
2019独角兽企业重金招聘Python工程师标准>>> 一.导入js库 <script type="text/javascript" src="& ...
- shiro放行_Shiro框架详解 tagline
部分面试资料链接:https://pan.baidu.com/s/1qDb2YoCopCHoQXH15jiLhA 密码:jsam 想获得全部面试必看资料,关注公众号,大家可以在公众号后台回复" ...
- [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解
深入浅出 Cocoa 之 Core Data(1)- 框架详解 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 Core data 是 Cocoa 中处 ...
- WebDriver自动化测试框架详解
webDriver自动化测试框架详解 一. 简介 WebDriver API相对于Selenium Remote Control API来说,虽然同样是控制浏览器,但它的编程接口更加简洁 WebDri ...
- atitit.jQuery Validate验证框架详解与ati Validate 设计新特性
atitit.jQuery Validate验证框架详解与ati Validate 设计新特性 1. AtiValidate的目标1 2. 默的认校验规则1 2.1. 使用方式 1.metadata用 ...
- Android 动画框架详解,第 1 部分
2019独角兽企业重金招聘Python工程师标准>>> Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果,本文将向读者阐述 Android 的动画框 ...
- springboot2整合mysql5_SpringBoot2整合SSM框架详解
SpringBoot2整合SSM框架详解 发布时间:2019-01-15 21:33, 浏览次数:1218 , 标签: SpringBoot SSM <>开发环境 * 开发工具:Eclip ...
最新文章
- DQL、DML、DDL、DCL的概念
- catia圆柱转化为圆台_浅析actran气动噪声仿真技术,以圆柱绕流气动噪声仿真为例...
- 你真的了解NSNotificationCenter吗?
- JAVA面试题(27)
- linux 版本的scipy,Linux 系统中 SciPy (Python 3) 编程环境
- C# MVC IOC、依赖注入
- boot lib分离 spring_SpringBoot打包分离依赖jar和资源文件
- html页面布局代码bootstrap,Bootstrap3.0学习笔记之页面布局
- FFmpeg AVFMT_NOFILE宏定义剖析
- 我的世界java下载慢怎么办_漫话:为什么你下载小电影的时候进度总是卡在99%就不动了?...
- C++ Primer Plus学习(十)——类和对象
- cesium 加载Googl式的切片
- 图像处理——使用模板对矩阵进行中值滤波(中值滤波模板)
- Mac 破解IDEA 持续更新
- 模拟电路 二极管门电路(二)
- excel2007整体调整行间距
- sshpass命令的安装使用
- Gitlab----Pipline流水线语法only、except、rules、workflow
- 这段代码,c 1秒,java 9秒,c# 14秒,而python。。。
- 在线教育项目_整体介绍