计算机视觉大型攻略 —— 立体视觉(1)基础部分

立体视觉网上资料很多,推荐Stefano Mattoccia的PPT。本文也是借(chao)鉴(xi)和使用这篇讲义的思路及图片。

下载链接:http://www.vision.deis.unibo.it/smatt/Seminars/StereoVision.pdf 

立体视觉,就是用两个或多个摄像头获取深度信息的技术。这几篇博文会从最基础的开始一步步的展开。这是第一篇理论基础。

双目视觉求解深度的理论依据

根据透视几何图形学的三角化原理,以双目视觉为例,左摄图片上任意一点,只要能在右摄图片上找到相应的匹

配点,就可以确定该点的三维坐标。两个像素坐标的差被称为视差。

以下是这个结论的证明过程,Stefano讲义里没有,我自己动手推了一下,完全可以略过。

如上图所示,点P在左右相机的成像位置为p0(u0, v0), p1(u1, v1),两相机焦距分别为f0, f1, 且二者相对位移RT已知。

fx0,fy0,fx1,fy1分别为左右相机在各自x,y两个轴上的焦距, c0和c1分别是左右图的中心像素。

根据小孔成像原理,

z_{0} \begin{bmatrix} u_{0}\\ v_{0}\\ 1 \end{bmatrix}=\begin{bmatrix} f_{x0} & 0 & c_{u0}\\ 0 & f_{y0} & c_{v0} \\ 0& 0& 1 \end{bmatrix}\begin{bmatrix} x_{0}\\ y_{0}\\ z_{0} \end{bmatrix}   ,      z_{1} \begin{bmatrix} u_{1}\\ v_{1}\\ 1 \end{bmatrix}=\begin{bmatrix} f_{x1} & 0 & c_{u1}\\ 0 & f_{y1} & c_{v1} \\ 0& 0& 1 \end{bmatrix}\begin{bmatrix} x_{1}\\ y_{1}\\ z_{1} \end{bmatrix}

再根据左右相机的相对位置关系,X1=RX0+T, 展开后,即

\begin{bmatrix} x_{1}\\ y_{1}\\ z_{1} \end{bmatrix}=\begin{bmatrix} r_{00} &r_{01} &r_{02} \\ r_{10} &r_{11} &r_{12} \\ r_{20}& r_{21}& r_{22} \end{bmatrix}\begin{bmatrix} x_{0}\\ y_{0}\\ z_{0} \end{bmatrix}+\begin{bmatrix} t_{0}\\ t_{1}\\ t_{2} \end{bmatrix}

联立这七个方程,能解出六个未知数x0,y0,z0,x1,y1,z1。

可以用Matlab解一下,结果比较长,就不贴了。这个结果的实际应用意义并不大,我也没怎么验证,只是为了证明上面的那个结论,只要找到左图上一点在右图上的匹配点,我们就可以求出该点在相机坐标系的坐标

clc,clear
syms x0 y0 z0 x1 y1 z1 u0 v0 cu0 cv0 fx0 fy0 u1 v1 cu1 cv1 fx1 fy1 r00 r01 r02 r10 r11 r12 r20 r21 r22 t0 t1 t2
[solx0,soly0,solz0,solx1,soly1,solz1]=solve(z0*u0==fx0*x0+cu0*z0,z0*v0==fy0*y0+cv0*z0,z1*u1==fx1*x1+cu1*z1,z1*v1==fy1*y1+cv1*z1, x1==r00*x0+r01*y0+r02*z0+t0,y1==r10*x0+r11*y0+r12*z0+t1,x0,y0,z0,x1,y1,z1);       
solutions=[solx0,soly0,solz0]

那么引入了下一个问题,如何在右图找到左图上对应的点

一般来讲,已知左图上一点,去右图上寻找对应点,是一个2D空间的搜索问题,这样导致算法复杂度非常高。

前辈们引入了对极几何的约束条件,将其转换成一个1D搜索问题。即左图上某一个点,在右图上可能的投影是在某一条线上。如上图所示,左图红线上的点,在右图也都在某一条线上,这样就把搜索范围由面降维到线。

极线约束(epipolar constraint)

图中红实线和绿实线分别是左右摄的极线,极线约束指的是左图极线(红实线)上的点,只能映射到右图极线(绿实线)上。

自然而然的,找对应匹配点的下一步工作就是要去寻找在右图中他可能存在的那条线极线了。

如果我们能够将左右摄完美对齐,且他们的内参(焦距等)完全一致,就可将左右摄像头的极线校正成行相同的平行线。因此,左图上任意一点,在右图中只能映射到与其对应的相同行上,即两点行坐标V相同。这样就完美解决了寻找极线的问题。

摄像头校正的内容较多,需要单独写一写。校正后进行匹配点的查找,也会单独写一篇。我们现在假设已经完成了这两步,一旦在右图上找到了p点的匹配点p',那么就可以通过三角化求得相机坐标系下的坐标。

三角化

上图是我在原PPT的基础上稍微修改了一下,P点在左摄相机坐标系下的坐标为(X,Y,Z),W为图像宽度,B为两个摄像头的距离也叫基线,p和p'分别为点P投影在左右两个图像上的点,且坐标原点在各自图像的左上角,所以Xr,Xt就是p和p'的纵坐标U0和U1, 根据相似三角形POrOt和Ppp', 

\frac{B}{Z}=\frac{pp'}{Z-f}=\frac{B-(X_{R}-\frac{W}{2})-(\frac{W}{2}-X_{T})}{Z-f}=\frac{B+X_{T}-X_{R}}{Z-f}    ,

Z=\frac{B*f}{X_{R}-X_{T}}=\frac{B*f}{d}

此外,W/2 = CU0,即中心点像素坐标(CU0, CV0),这里CU0, CV0是图像坐标系的坐标,原点在图片的左上。这样定义坐标系实际上为了工程上应用更方便,因为绝大多数情况下图片坐标系原点都在左上角。之前看到一些文章采用了图片中心为原点的坐标系(直接XR*B/d,不减掉CU),那样是不能直接代入图像坐标系坐标的。

左摄坐标系下,类似的可以通过相似三角形求得X,Y坐标,

\frac{X_{R}-CU_{0}}{X}=\frac{f}{Z}           =>    X=\frac{(X_{R}-CU_{0})*B}{d}

 \frac{Y_{R}-CV_{0}}{Y}=\frac{f}{Z}           =>    Y=\frac{(Y_{R}-CV_{0})*B}{d}

从Z的公式可以看到,在B, f不变的情况下,Z越大,d越小,即越远视差越小。f, Z不变的情况下,B越大,d越大。这其实意味着基线越大,看的越远。

总结一下,已知左图上点P, 只要在右图上找到与其对应的P',就可以计算深度。通过对极约束和对图像进行平行化处理, P'总是出现在P的同一行上。

深度图计算流程

通常通过立体视觉获得深度图需要校准,矫正,立体匹配,三角化四个过程。三角化计算上文已经讲了,后续文章会讲解其他部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值