立体视觉知识补充

更新时间:2023-10-09 17:53:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

现在我们有一架平衡双目摄像机,和一个棋盘和一个待重构的物体或者要拍摄的画面,我们的目的就是利用两个摄像机捕捉同一个画面或者物体图像,然后根据在两幅图像上遍历同一个世界三维点映射到两个图像平面的响应匹配点,然后利用匹配点视差和摄像机相关参数,以及图像二维点的信息就可以得到世界物体的三维坐标。

1、立体标定

cvStereoCalibrate(),利用两个摄像机同时捕获的不同视场来实现标定,同时获得本征矩阵E,基础矩阵F,两摄像机坐标系的旋转矩阵R和平移矩阵T或者摄像机内参数M和畸变系数distCoeffs。

立体标定和单摄像机标定是有区别的。立体标定除了可以计算出摄像机的内参数和畸变系数,还可以计算出本征矩阵E,基础矩阵F,两个摄像机的旋转矩阵R和平移向量T.

立体标定函数参数中需要两个着相机的内参数和畸变系数,它们即可以作为输入,也可以作为输出,这里我们让它们作为输出,由立体标定函数计算它们。

因此,我们就可以手持棋盘,然后用两个摄像机同时捕捉棋盘的不同视场,对于每一个视场,我们两个摄像机都有拍摄的同一棋盘的图像对,对于两个摄像机旋转矩阵R和平移向量T,我们通过一个视场就可以求解出来,然而为了计算结果的稳定,则需要多个视场来优化结果。对于两个摄像机的内参数矩阵和畸变系数,我们至少需要10个视场。因此,我们可以通过手持棋盘,旋转和平移棋盘以获得10个视场,从而获得10幅图像对,来进行立体标定。

在这一步,我们利用极线约束来检查标定的结果。(有了本征矩阵我们就可以得到基础矩阵,有了基础矩阵,我们就可以计算极线)

2、立体校正

cvStereoRetify(),利用相机内参数以及上一步得到R,T,得到两个摄像机极线水平对准的旋转矩阵Rl和Rr,投影矩阵P,重投影矩阵Q,为实现两幅图像水平对准准备数据。

该函数名为立体校正,并没有完成真正的立体校正,而是获得了立体校正的所需要的参数。通过立体校正,我们可以获得两个摄像机的投影矩阵P,有了投影矩阵,我们可以利用相机模型公式5-19,然后在利用立体校正后的图像(特征点水平对齐)来进行三维坐标计算。然而我们可能并不这样做,因为OpenCV已经给出了计算的函数,输入视差图和重投影矩阵Q,得到三维点坐标。

有时候,我们在三维重建的时候,这样做:假设我们想重建一个物体,我们用两个摄像机拍摄这个物体,如果该物体有足够的surf特征点,我们获取这两幅图像的特征点的坐标位置,然后利用立体校正得到投影矩阵,计算获取物体三维点云。这样的步骤是错误的,或者做出来可能效果也不好。因为我我们进行立体标定的目的是为了使得两幅图像水平对齐,也就是两台摄像机的光轴是平行的,即无穷远处相交。我们知道对于两幅图像,水平对齐后,像对于的特征点或者匹配点在同一图像扫描行上,这样,我们才能利用理想情况下的深度公式:Z=fT/x1-x2,f为焦距,T表示两个相机光轴之间的距离。我们可以假设,如果我们获得的两幅图像对应的匹配点,不在同一行,那么x1-x2,就会发生变化。

因此,如果我们在做图像预处理时,一定要始终保持两幅图像的大小是一样的。不能随便的剪切。

3、校正映射

分为两个步骤:计算查找表和重投影,此步完成真值的图像的校正。

1、cvInitUndistortRectifyMap()函数利用摄像机内参数M和畸变系数,以及投影矩阵P或者校正后的摄像机内参数Mrect,以及旋转矩阵T,来计算原始图像到校正后的查找表。

2、cvRemap函数,利用计算得到的查找表,和拍摄得到原始图像,设置一定的插值方法,得到校正后的图像。

由于左右图像都需要校正,所以该过程要进行两次。

4、立体匹配

到了这一步,我们就可以根据具体的情况,应用不同的特征点匹配了。

OpenCV实现的块匹配算法相当于密集点匹配算法,我们也可以利用稀疏点匹配算法,如sift等。通过这些匹配点,我们就可以获得匹配点的位置,即x1和x2,我们就可以计算得到他们之间的视差,从而得到计算得到三维点坐标。

对于一个物体点的坐标(X,Y,Z),我们关心的更多的是Z,Z就是所谓的深度,通俗一点:Z是两个摄像机透镜中心(光心)所在平面到物体点所在平面之间的距离。(推导见:相机模型)因为我们计算的过程中操作的的大部分是像素,那么我们得到距离也是用像素来度量的。

5、现实世界单位和像素的关系

这个问题是个头疼的问题,我感觉只有等待自己亲自验证了,才能肯定的回答,但是我在这里分析一下先。

1)世界物体的三维点,一般选择的应该是左摄像机的投影中心为坐标系的原点(数学模型中的)。视差是左摄像机对应的匹配点的x坐标减去右相机对应的匹配点的x坐标。

我们知道,如果知道了视差和重投影矩阵,以及匹配点就可以根据公式求解出三维点坐标。我们将主要公式列出:

(Q中除了c'x来至于右相机,其他参数均是左相机,Tx为为左摄像机投影中心到右摄像机投影中的平移向量的x分量)如果Q是由Pl和Pr联合求解的得到的话,那么Q中cx和cy等参数都应该是校正后的摄像机参数了。如果那样的话,主光线在无穷远处相交,则cx=c'x,既然我们使用的校正后的摄像机内参数,那么cx就必然等于c'x了,那为什么还会列出上面的Q表达式呢,直接将Q矩阵的右下角设置为0不就好了吗?难道它也在告诉我们,我们使用Q时也可以在用校正前的摄像机内参数求解?这不得而知了。

2)我们知道摄像机的内参数是根据单应性求解得到的。 为了理解,我们引入下图:

在棋盘平面上,我们定义一个三维坐标系,棋盘平面上的一个内角点就是一个世界物理点,这个三维坐标系中,棋盘位于xoy平面内,那么棋盘上的点的z坐标就是0值。

我们知道从棋盘上的点(X,Y,0),映射到图像平面内的点(x,y),如果没有摄像机内参数的影响,即摄像机是完美的,也或者说摄像机的内参数矩阵是单位阵。那么三维点(其实是平面内的一点)经过一定的旋转R和平移t,就可以到达图像平面内的一点。但是实际上摄像机并不是完美的,那么这个单应性矩阵中,就含有摄像机的内参数。

摄像机通过求解单应性求解内参数。

单应性矩阵由摄像机内参数、旋转矩阵和平移向量构成,其中摄像机内参数矩阵是不变量,旋转和平移是由不同视场决定。

那么我们采用不同的棋盘格子的大小,那么该格子的大小将影响哪些呢?其实将影响平移向量的结果。

旋转矩阵OpenCV中说到的是R=[r1,r2,r3],三个矢量两两正交,并且模是相等的。那么我们就可以将其系数提出,那么R就为正交矩阵。其实我感觉构造R的时候,R就是一个正交矩阵。一个正交矩阵乘上一个向量,那么该向量的模是不变的,这也是线性代数中学的正交变换。那么棋盘各自的大小的信息成分,就转化到了平移向量身上

1、线性模型

可用针孔模型来近似表示任一点P(Xc,Yc,Zc)在像平面的投影位置,也就是说,任一点P(Xc,Yc,Zc)的投影点p(x,y)都是OP(即光心(投影中心)与点P(Xc,Yc,Zc)的连线)与像平

面的交点如上一篇文章中的图2.2。对应比例关系可得:

(说明:Xc的c下表表示camera相机,上述公式是在相机坐标系内,利用三角形相似原理,即x/f=Xc/Z,其中上述公式的单位为毫米,f表示焦距单位毫米)

上式可以用齐次坐标与矩阵的形式表示为:

将上一篇文章中的(2.3)和(2.4)代入(2.6)式就可以得到点P的世界坐标与其投影坐标(u,v)之间的关系为:

(说明:上述公式中完成了从世界坐标系到图像坐标系的转变,中间经过了相机坐标系的过度,Xw中的w表示world世界,单位为毫米,而u,v是的 单位为像素,即完成了从毫米——像素的转换。)

其中ax=f/dx,ay=f/dy;M是3×4的矩阵—投影矩阵,M1完全由相机的内参数ax,ay,u0,v0决定,(u0,v0)为主点坐标,ax,ay分别表示图像u轴和v轴上的尺度因子,M2则完全由相机的外部参数决定。而相机标定就是确定相机的内外参数。

由式(2.7)可知,若已知相机的内外参数,则相当于已知投影矩阵M.当已知M和空间点P的坐标:矢量Xw=(Xw,Yw,Zw,1)T,(矢量Xw上面有一个矢量标识杠,T表示矢量的转置)。式(2.7)可以给出三个方程,消去Zc就可以得到其投影点p的坐标(u,v)(其实也就是我用一个相机就可以拍摄一个物体的图片了)。但是由于M为3×4不可逆矩阵,当 点P的投影坐标(u,v)和投影矩阵M为已知时,我们只能得到关于Xw,Yw,Zw的两个线性方程,即射线OP的方程,由上一篇图2.2我们可以看出,位于射线OP上的所有空间点的投影点(即图像点)都是p点。所以不能唯一确定空间点P的世界坐标矢量Xw.

所以,为了得到空间物体的三维世界坐标,就必须有两个或更多的相机构成立体视觉系统模型才能实现。

2、非线性相机模型

在实际的成像过程中,考虑镜头的失真,一般都存在非线性畸变,所以线性模型不能准确描述成像几何关系。非线性畸可用下列公式描述:

若考虑非线性畸变,则对相机标定时需要使用非线性优化算法。而有研究表明引入过多的非线性参入(如离心畸变和薄棱畸变)不仅不能提高精度,还会引起解的不稳定。一般情况下径向畸变就足以描述非线性畸变,所有本课题只是考虑径向畸变。则将式(2.9)中的径向畸变代入式(2.8)可得:

OpenCV中讲解:

从制作上讲,从制作一个”球形“透镜比制作一个数学上理想的透镜更容易。故产生了径向畸变。

从机械方面讲,也很难把透镜和成像仪保持平衡。故产生了切向畸变。

1、径向畸变

对径向畸变,成像仪中心(光学中心)是畸变为0,随着向边缘移动,畸变越来越严重。故我们可以用在r=0处的泰勒级数展开的前几项来定量描述。

对于便宜的网络摄像机,我们通常使用前两项,其中通常第一项为k1,而第二项为k2。对畸变很大的摄像机,比如鱼眼透镜,我们使用第三个径向畸变项k3。通常成像仪某点的径向位置按下式调节:

这里(x,y)是畸变点在成像仪上的原始位置,(xcorrected,ycorrected)表示矫正后的新位置。

2、切向畸变

切向畸变是由于透镜制造上的缺陷使得透镜本身与图像平面不平行而产生的。径向畸变可以有两个额外的参数p1和p2来描述,如下:

因此总共有5个我们需要的畸变参数。由于在OpenCV程序中5个参数是必需的,所以它们被放置到一个畸变向量中,这是一个5×1的矩阵,按顺序依次包含k1,k2,p1,p2和k3。

3、平行双目立体视觉模型

通过针孔成像模型的分析可知,为了由像点坐标唯一的确定世界三维坐标,就必须通过两个或者多个相机来共同完成。通过两个相隔一定距离的相机来实现对3D场景的成像,就是双目成像,也称为立体视觉成像。相机拍摄景物时,先把两部相机的光轴汇聚于感兴趣的物体上,则两个光轴的交点称为汇聚点,而该点到基线中心的距离称为汇聚距离。当汇聚的距离有限时,双目立体视觉系统统称为汇聚式双目立体视觉模型;当汇聚距离无线远时,双目立体视觉系统就被成为平行式双目立体视觉模型。本文研究的是平行双目立体视觉系统,下面着重介绍一下平行双目立体视觉模型。

如图2.3所示,当目标距离远远大于焦距时,可假定透镜中心与像平面的距离等于摄像机的焦距f(=OlCl=OrCr)。两光轴平行且距离(即基线)为2h。世界坐标系定义为OXYZ,左右图像平面都与相机平面XOY平行,其中Ol、Or分别为左图像与右图像的中心(即左右

图像局部坐标系的原点,Xl,Xr分别表示左右相机局部坐标系的X轴),Cl和Cr分别为左右相机的光心,Z轴表示到摄像机(在Z=0处)的距离。X轴表示“水平”距离(Y轴朝负面而去,没有出现,即满足右手坐标准则)。X=0是右相机光心位置。光心即投影中心。

假设三维空间点P(X,Y,Z)的像在左、右两个像平面上的投影分别是Pl(xl,yl)和Pr(xr,yr)(其中xl,yl,xr,yr分别表示投影点在每个图像局部坐标系即2.1节所讲的图像坐标系O1xy中的坐标)。由小孔成像原理可知:P,Cl,Pl三点共线,则由三角相似,可得:

(这里我只是把内容以图片的形式贴出来,不在手写了,论文中下面部分存在是错误的)

下面内容摘自:西安工业大学 基于双目立体视觉的图像匹配与三维重建 张海波

5、基于双目立体视觉技术的三维重建

摄像机通过透视变换将物体的三维信息转换为二维图像,因为二维图像中的点与三维物体上的点可以通过某种对应关系相互转换,也就是说,可以从不同方向拍摄的同一空间点的两幅图像中的依据该对应关系反推出三维物体的立体空间位置。这就是双目立体视觉中三维信息获取的过程。两幅图像通过立体匹配可得到各特征点的视差信息,根据视差信息确定各点的深度信息,最终获得被测物体的三维信息。

5.1 双目立体视觉三维测量原理

如图5.1所示,两台摄像机的镜头中心或光学中心之间的距离称为双目视觉系统的基线B,利用双目视觉成像系统可以确定具有像平面坐标点(x1,y1)和(x2,y2)的三维空间点W的世界坐标。

1)两台摄像机相同且它们的摄像机坐标系统各对应轴精确平行(光轴平行)

图5.2给出了两台摄像机镜头连线所在平面(XZ平面)。将世界坐标系设置在第一台摄像机坐标系上,即世界坐标系和第一台摄像机的摄像机坐标系重合。

根据摄像机坐标系与世界坐标系重合情况下的透视变换公式,三维空间点W的X轴坐标表示为:

式中X1和Z1为三维空间点形在世界坐标系(此时世界坐标系与第一个摄像机坐标系重合)中的X轴和Z轴坐标。同理,如果将世界坐标系设置在第二台摄像机上,则W点在X轴的坐标可表示为:

因为基线长度是B且三维空间点W的Z轴坐标对两台摄像机坐标系统是一样的,所以有:

将式(5.3)带入式(5.1)和式(5.2),得

式(5.6)把三维空间点与像平面之间的距离Z,即三维信息中的深度信息,与视差D(三维点对应的像坐标x2和x1之差)直接联系起来。视差的大小直接与深度有关,所以视差包含了物体的三维空间信息。通过视差就可以求得三维空间点到摄像机的距离,确定三维空间点在世界坐标系中的坐标。

如果视差D可以确定并且已知两台摄像机之间的基线距离和摄像机的焦距,很容易计算出三维空间点W的Z轴坐标。另外Z轴坐标确定后点W的世界坐标X,Y轴坐标可用(x1,y1)和(x2,y2)借助透视变换得到,即:

这样,通过三维空间点在两台摄像机的成像视差,可求出空间点的三维坐标。因此,对于两台摄像机平面上的任意一点,只要能够在另一台摄像机平面上找到对应的匹配点(即两者是空间同一点在两台摄像机面上的像点),就可以通过视差确定出该点的三维空间点。

(说明:对于上述公式,我们如果设置相机1为参考世界坐标系,则空间三维点的计算通过X1,Y1的表达式进行计算,反之对于相机2也是同样的道理)。

个人理解部分:

在上图,我们选择左图像的中心O1为世界坐标原点。M表示世界坐标系中的一点,p1和p2表示该点经过透镜投影到画布上的位置。设p1点为(x1,y1),p2点为(x2,y2),(这里点p1和点p2均是在世界坐标系中的坐标,即相对于O1点的坐标,不要为上面的标号所迷糊,切记!因为我们下面的推导就是针对如此的)M点为(X,Y,Z)。我们知道OpenCV坐标系中图中R1和R2为图像平面的原点,即相当于p1,p2的参考点的同时变化。这里,我们知道两个图像分辨率是一样的,即两个图像的平面是一样的大小,我们应用的相似三角形的知识,故我们只需要确保在列出的比例关系中,能够保存长度是正的就可以了。

首先我们要证明一点,上图中直线O1p1和直线MO3是平行的,利用高中所学的知识:

我们知道了O1p1和MO3是平行的,那么就可以知道三角形O1p1D和三角形MO3A相似,又因为线段O1p1和线段MO3的比值等于线段p1C1和线段C1O3的比值,即等于f/Z-f。

从上图我们知道,点p1的x1,y1均小于0。我们现在要列出点p1和点p2的坐标,以及额外的已知参数与真实点M坐标之间的关系。由线段p1D=0-x1,线段O3A=X,那么我们就可以得到如下的一个公式:

同理我们对于点p1的y1坐标,也进行相似变换。即线段O1D=0-y1,线段MA=Y。那么我们可以得到如下的公式:

接下来我们要求解p2点的坐标x2,y2和M点坐标之间的关系,我们同样的利用三角形相似来找它们坐标之间的关系,我们同样可知道三角形O2p2E和三角形MO4A是相似的。

那么线段Ep2=x2-B,线段AO4=B-X,那么他们之间的比例还是满足f/Z-f,得到如下的公式:

知道P点的深度,如果用C1,C2两台摄像机同时观察P点,并且在摄像机C1图像上点p1与在摄像机C2图像上点p2是空间同一点P的像点,则P点的位置是唯一确定的,为射线O1p1和O2p2上的交点。

假定已检测出p1和p2为空间点P在两台摄像机上对应的图像点。在两台摄像机都已标定的情况下,它们的投影矩阵分别为M1与M2,由摄像机模型

关于如何求解投影矩阵,OpenCV中有,下面给出一个截图,讲述了大题的操作步骤:

5、总结

1、有时候感觉参考了几篇下载的论文,看一些原理,里面出现的错误,弄的自己稀里糊涂,后来发现Learning OpenCV书中自带的要详细,而且也不会出现错误,好比上面我们在关于利用几何变换来求解三维空间点时,OpenCV书中给出了一个很好的图:

上图摄像机坐标系以左摄像机的投影中心为原点。通过上图,我们可以很容易的找到三角形之间的相似关系,也可以在理想的情况下,通过相似关系来求解三维点的坐标。

本文来源:https://www.bwwdw.com/article/l9zf.html

Top