精华内容
下载资源
问答
  • 立体视觉

    2020-04-26 16:38:01
    立体视觉问题的基本步骤,就是在完成摄像机标定后,在多幅图像中建立对应点对,然后重构场景中的三维坐标。这一过程也称为Structure from motion(SFM),即由一系列包含着视觉运动信息(motion signals)的多幅二维...


    立体视觉问题的基本步骤,就是在完成摄像机标定后,在多幅图像中建立对应点对,然后重构场景中的三维坐标。这一过程也称为Structure from motion(SFM),即由一系列包含着视觉运动信息(motion signals)的多幅二维图像序列(2D image sequences)估计三维结构(3D model)的技术。

    一 实验原理

    1.整体流程

    一般来说,通过立体视觉获得深度图需要校准,矫正,立体匹配,三角化四个过程。

    在这里插入图片描述2 2.

    2.极线约束

    在这里插入图片描述
    图中红实线和绿实线分别是左右拍摄的极线,极线约束指的是左图极线(红实线)上的点,只能映射到右图极线(绿实线)上。
    在这里插入图片描述
    找对应匹配点的下一步工作就是要去寻找在右图中他可能存在的那条线极线了。
    如果能将左右摄完美对齐,且他们的内参(焦距等)完全一致,就可将左右摄像头的极线校正成行相同的平行线。因此,左图上任意一点,在右图中只能映射到与其对应的相同行上,即两点行坐标V相同。这样就完美解决了寻找极线的问题。3

    3.三角化

    在这里插入图片描述
    BZ=ppZf=B(XRW2)(W2XT)Zf=B+XTXRZf\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}

    BfXRXT=Bfd\frac{B*f}{X_R-X_T}=\frac{B*f}{d}
    由上述公式发现在B, f不变的情况下,Z越大,d越小,即越远视差越小。f, Z不变的情况下,B越大,d越大。这其实意味着基线越大,看的越远。

    4.立体匹配

    目前立体匹配算法是计算机视觉中的一个难点和热点,算法很多,但是一般的步骤是:
    ①匹配代价计算
    匹配代价计算是整个立体匹配算法的基础,实际是对不同视差下进行灰度相似性测量。常见的方法有灰度差的平方SD(squared intensity differences),灰度差的绝对值AD(absolute intensity differences)等。另外,在求原始匹配代价时可以设定一个上限值,来减弱叠加过程中的误匹配的影响。以AD法求匹配代价为例,可用下式进行计算,其中T为设定的阈值。

    C(xt,yt)C(x_t,y_t)=
    IL(xt)IR(yt),IL(xt)IR(yt)<T|I_L|(x_t)-|I_R(y_t)|, |I_L|(x_t)-|I_R(y_t)|<T
    T,IL(xt)IR(yt)>TT,|I_L|(x_t)-|I_R(y_t)|>T

    ②匹配代码叠加
    一般来说,全局算法基于原始匹配代价进行后续算法计算。而区域算法则需要通过窗口叠加来增强匹配代价的可靠性,根据原始匹配代价不同,可分为:
    sum of Absolute differences(SAD):
    C(x,y,d)=xSIR(x,y)I(x+d),yC(x,y,d)=\sum_{x∈S}^{}|I_R(x,y)-I_(x+d),y|

    sum of Squared differences(SSD):
    C(x,y,d)=xSIR(x,y)I(x+d),y2C(x,y,d)=\sum_{x∈S}^{}|I_R(x,y)-I_(x+d),y|^{2}

    sum of truncated absolute differences(STAD):
    C(x,y,d)=min{xSIR(x,y)I(x+d),y,T\sum_{x∈S}^{}|I_R(x,y)-I_(x+d),y|,T}
    ③视差获取
    对于区域算法来说,在完成匹配代价的叠加以后,只需在一定范围内选取叠加匹配代价最优的点(SAD和SSD取最小值,NCC取最大值)作为对应匹配点。

    ncc(I1,I2)=x(I1(x)u1)(I2(x)u2)x(I1(x)u1)2x(I2(x)u2)2ncc(I_1,I_2)=\frac{\sum_{x}^{}(I_1(x)-u_1)(I_2(x)-u_2)}{\sqrt{\sum_{x}^{}(I_1(x)-u_1)^{2}\sum_{x}^{}(I_2(x)-u_2)^{2}}}

    ④视差细化
    大多数立体匹配算法计算出来的视差都是一些离散的特定整数值,可满足一般应用的精度要求。但在一些精度要求比较高的场合,如精确的三维重构中,就需要在初始视差获取后采用一些措施对视差进行细化,如匹配代价的曲线拟合、图像滤波、图像分割等。

    二 实验内容

    1.实验结果

    ①实现NCC视差匹配方法
    数据一:
    在这里插入图片描述
    在这里插入图片描述

    结果:
    在这里插入图片描述
    数据二:
    在这里插入图片描述
    在这里插入图片描述
    结果:
    在这里插入图片描述

    分析:物体越近,视差越大,结果区域越明亮;相反,物体越远视差越小,结果区域越暗沉

    ②不同窗口值对匹配结果的影响
    取①中的数据二。
    wid=3:
    在这里插入图片描述
    wid=5:
    在这里插入图片描述
    wid=7:
    在这里插入图片描述
    wid=9:
    在这里插入图片描述
    wid=11:
    在这里插入图片描述

    分析:
    (1)窗口值较小时,在弱纹理区域,窗口内像素值相似,相邻区域的相似度函数值差异不显著。窗口包含的纹理区域太小,区分度不足。在重复纹理区域内像素值接近。这些影响都容易产生导致结果产生错误。
    (2)窗口值较大时,由于立体匹配中存在遮挡问题,在边缘处背景容易被错分成前景,造成前景放大。
    (3)随着窗口值的增大,结果逐渐变得清晰,匹配精度变高。尤其是从3到9的过程极为明显,wid=9和wid=11的差距较小。根据实验结果可以发现wid = 9是比较适合的窗口值。

    2.实验代码

    stereo.py:

    from numpy import *
    from scipy.ndimage import filters
    
    def plane_sweep_ncc(im_l,im_r,start,steps,wid):
    #使用归一化的互相关计算视差图像 """
     m,n = im_l.shape
     # 保存不同求和值的数组
     mean_l = zeros((m,n))
     mean_r = zeros((m,n))
     s = zeros((m,n))
     s_l = zeros((m,n))
     s_r = zeros((m,n))
     # 保存深度平面的数组
     dmaps = zeros((m,n,steps))
     # 计算图像块的平均值
     filters.uniform_filter(im_l,wid,mean_l)
     filters.uniform_filter(im_r,wid,mean_r)
     # 归一化图像
     norm_l = im_l - mean_l
     norm_r = im_r - mean_r
     # 尝试不同的视差
     for displ in range(steps):
     # 将左边图像移动到右边,计算加和
      filters.uniform_filter(roll(norm_l,-displ-start)*norm_r,wid,s) # 和归一化
      filters.uniform_filter(roll(norm_l,-displ-start)*roll(norm_l,-displ-start),wid,s_l)
      filters.uniform_filter(norm_r*norm_r,wid,s_r) # 和反归一化
     # 保存 ncc 的分数
      dmaps[:,:,displ] = s/sqrt(s_l*s_r)
     # 为每个像素选取最佳深度
     return argmax(dmaps,axis=2)

    ncc.py:

    import stereo
    import scipy.misc
    from PIL import Image
    from pylab import *
    
    im_l = array(Image.open('D:/zq/scene1.row3.col3.ppm').convert('L'),'f')
    im_r = array(Image.open('D:/zq/scene1.row3.col4.ppm').convert('L'),'f')
    # 开始偏移,并设置步长
    steps = 12
    start = 4 
    
    # ncc 的宽度
    wid = 9
    
    res = stereo.plane_sweep_ncc(im_l,im_r,start,steps,wid)
    
    imsave('depth.png',res)
    

    三 遇到的问题

    问题1:在这里插入图片描述
    这个问题说明此处需要缩进,只需在出现错误的那一行,按空格或Tab(但不能混用)键缩进即可。

    问题2:
    在这里插入图片描述
    这个问题好像是spicy的版本问题。可以选择降低版本来解决,但是尝试了一下直接使用imsave函数发现也可以输出结果。

    问题3:在这里插入图片描述
    这个问题一开始一直解决不了,百度也没有得到答案。后来觉得可能是自己加的定义语句中的from array import array这句的问题。查找了以前写过的有使用array的代码,将这句语句替换成from PIL import*即可。

    四 实验总结

    1.立体匹配技术被普遍认为是立体视觉中最困难也是最关键的问题,主要有以下因素的影响: 光学失真和噪声(亮度、色调、饱和度等失衡),平滑表面的镜面反射,投影缩减,透视失真,低纹理,重复纹理,透明物体,重叠和非连续。
    2.大尺寸窗口有利于解决弱纹理,孔径问题,重复纹理。小尺寸窗口利于解决前景放大问题。

    展开全文
  • 立体视觉,求取视差图,效果不错,可以使用
  • 双目立体视觉

    2018-07-29 10:27:59
    双目立体视觉,双目立体视觉,计算机双目立体视觉,计算机双目立体视觉
  • 立体视觉系统-源码

    2021-02-17 11:24:07
    立体视觉系统
  • 双目立体视觉 20181126

    2018-11-26 18:46:39
    双目立体视觉 .
  • 共轴立体视觉深度测量
  • 计算机双目立体视觉

    2018-04-10 10:38:11
    《计算机双目立体视觉》是一本比较全面和系统研究计算机双目立体视觉理论、技术及其应用的学术专著。 《计算机双目立体视觉》在介绍双目视觉基本原理的基础上,阐述了双目立体视觉的实现技术。同时,本书针对传统...
  • 双目立体视觉.pdf

    2020-12-21 20:12:05
    双目立体视觉.pdf
  • matlab开发-学生竞赛的计算机视觉立体视觉立体视觉(第11章):学生竞赛队计算机视觉训练
  • 立体视觉的研究具有重要的应用价值,其应用包括移动机器人的自主导航系统,航空及遥感测量,工业自动化系统等。 一般而言,立体视觉的研究有如下三类方法: (1) 直接利用测距器(如激光测距仪)获得程距(range data...

    一、原理

    1. 介绍
      立体视觉是计算机视觉领域的一个重要课题,它的目的在于重构场景的三维几何信息。立体视觉的研究具有重要的应用价值,其应用包括移动机器人的自主导航系统,航空及遥感测量,工业自动化系统等。
      一般而言,立体视觉的研究有如下三类方法:
      (1) 直接利用测距器(如激光测距仪)获得程距(range data)信息,建立三维描述的方法;
      (2) 仅利用一幅图象所提供的信息推断三维形状的方法;
      (3) 利用不同视点上的,也许是不同时间拍摄的,两幅或更多幅图象提供的信息重构三维结构的方法。

    2. 整体流程

      (1) 图象获取 (image acquisition)

      用作立体视觉研究的图象的获取方法是多种多样的,在时间、视点、方向上有很大的变动范围,直接受所应用领域的影响。立体视觉的研究主要集中在三个应用领域中,即自动测绘中的航空图片的解释,自主车的导引及避障,人类立体视觉的功能模拟。不同的应用领域涉及不同类的景物,就场景特征的区别来分,可以划分成两大类,一类是含有文明特征(cultural features)的景物,如建筑、道路等; 另一类是含有自然特征的景物和表面(natural objects and surfaces), 如山、水、平原及树木等。不同类的景物的图象处理方法大不相同,各有其特殊性。

      (2) 摄像机模型 (camera modeling)

      摄像机模型就是对立体摄像机组的重要的几何与物理特征的表示形式,它作为一个计算模型,根据对应点的视差信息,用于计算对应点所代表的空间点的位置。摄像机模型除了提供图象上对应点空间与实际场景空间之间的映射关系外,还可以用于约束寻找对应点时的搜索空间,从而降低匹配算法的复杂性,减小误匹配率。

      (3) 特征抽取 (feature acquisition)

      几乎是同一灰度的没有特征的区域是难以找到可靠匹配的,因而,绝大部分计算机视觉中的工作都包括某种形式的特征抽取过程,而且特征抽取的具体形式与匹配策略紧密相关。在立体视觉的研究中,特征抽取过程就是提取匹配基元的过程。

      (4) 图象匹配 (image matching)

      图象匹配是立体视觉系统的核心,是建立图象间的对应从而计算视差的过程,是极为重要的。

      (5) 深度计算 (distance(depth) determination)

      立体视觉的关键在于图象匹配,一旦精确的对应点建立起来,距离的计算相对而言只是一个简单的三角计算而已。然而,深度计算过程也遇到了显著的困难,尤其是当对应点具有某种程度的非精确性或不可靠性时。粗略地说,距离计算的误差与匹配的偏差成正比,而与摄像机组的基线长成反比。加大基线长可以减少误差,但是这又增大了视差范围和待匹配特征间的差别,从而使匹配问题复杂化了。为了解决这一问题出现了各种匹配策略,如由粗到精策略,松驰法等。

      (6) 内插 (interpolation)

      在立体视觉的应用领域中,一般都需要一个稠密的深度图。基于特征匹配的算法得到的仅是一个稀疏而且分布并不均匀的深度图。在这种意义下,基于区域相关匹配的算法更适合于获得稠密的深度图,但是该方法在那些几乎没有信息(灰度均匀)的区域上的匹配往往不可靠。因此,两类方法都离不开某种意义的内插过程。最为直接的将稀疏深度图内插成稠密的深度图的方法是将稀疏深度图看作为连续深度图的一个采样,用一般的内插方法(如样条逼近)来近似该连续深度图。当稀疏深度图足以反映深度的重要变化时,该方法可能是合适的。如起伏地貌的航空立体照片的处理中用这种方式的内插也许是比较合适的。但是这种方法在许多应用领域中,尤其是在有遮掩边界的图象的领域中,就不适用了。

    3. 几何原理
      对应于同一场景点的点对

    在这里插入图片描述

    1. 极线校正
      对极约束意味着一旦我们知道了立体视觉系统的对极几何之后,对两幅图像间匹配特征的二维搜索就转变成了沿着极线的一维搜索。

    2. 匹配代价计算(Cost Computation)

      计算匹配代价,即计算参考图像上每个像素点IR§,以所有视差可能性去匹配目标图像上对应点IT(pd)的代价值,因此计算得到的代价值可以存储在一个hwd(MAX)的三维数组中,通常称这个三维数组为视差空间图(Disparity Space Image,DSI)。匹配代价时立体匹配的基础,设计抗噪声干扰、对光照变化不敏感的匹配代价,能提高立体匹配的精度。因此,匹配代价的设计在全局算法和局部算法中都是研究的重点。

      匹配代价计算的目的是衡量待匹配像素与候选像素之间的相关性。两个像素无论是否为同名点,都可以通过匹配代价函数计算匹配代价,代价越小则说明相关性越大,是同名点的概率也越大。

      每个像素在搜索同名点之前,往往会指定一个视差搜索范围D(Dmin ~ Dmax),视差搜索时将范围限定在D内,用一个大小为W×H×D(W为影像宽度,H为影像高度)的三维矩阵C来存储每个像素在视差范围内每个视差下的匹配代价值。矩阵C通常称为DSI(Disparity Space Image)。

      匹配代价计算是整个立体匹配算法的基础,实际是对不同视差下进行灰度相似性测量。常见的方法有灰度差的平方SD(squared intensity differences),灰度差的绝对值AD(absolute intensity differences)等。另外,在求原始匹配代价时可以设定一个上限值,来减弱叠加过程中的误匹配的影响。以AD法求匹配代价为例,可用下式进行计算,其中T为设定的阈值。
      C(xi,yi)={IL(xi)IR(yi),IL(xi)IR(yi)<TT,IL(xi)IR(yi)>T C(x_i,y_i)= \begin{cases} \begin{vmatrix} I_L(x_i)-I_R(y_i)\end{vmatrix}, & \text {$\begin{vmatrix} I_L(x_i)-I_R(y_i)\end{vmatrix}<T$} \\ T, & \text{$\begin{vmatrix} I_L(x_i)-I_R(y_i)\end{vmatrix}>T$} \end{cases}

      这就是在参数设置中阈值的作用,在视差图中经常有黑色区域,就是和阈值的设置有关。

    3. 代价聚合(Cost Aggregation)

      通常全局算法不需要代价聚合,而局部算法需要通过求和、求均值或其他方法对一个支持窗口内的匹配代价进行聚合而得到参考图像上一点p在视差d处的累积代价CA(p,d),这一过程称为代价聚合。通过匹配代价聚合,可以降低异常点的影响,提高信噪比(SNR,Signal Noise Ratio)进而提高匹配精度。代价聚合策略通常是局部匹配算法的核心,策略的好坏直接关系到最终视差图(Disparity maps)的质量。

      代价聚合的根本目的是让代价值能够准确的反映像素之间的相关性。上一步匹配代价的计算往往只会考虑局部信息,通过两个像素邻域内一定大小的窗口内的像素信息来计算代价值,这很容易受到影像噪声的影响,而且当影像处于弱纹理或重复纹理区域,这个代价值极有可能无法准确的反映像素之间的相关性,直接表现就是真实同名点的代价值非最小。

    4. 视差图计算(Disparity Map Computation):

      深度信息可以通过计算一幅图像和其它图像的特征位置的像素差获得。视差图和深度图很像,因为视差大的像素离摄像机近,而视差小的像素离摄像机远。按以米为单位来计算摄像机距物体多远需要额外的计算。

      计算视差图的标准方法是用简单的块匹配(Block Matching)。我们选择右边图像中的一块小区域,并在左边图像中搜索匹配最近的像素区域。同理,当搜索右边图像时,我们从和左边图像的模板相同的坐标处开始,向左和向右搜索至最大距离。视差为右边图像的小区域和左边图像的最近匹配区域的中心像素的水平距离。

      归一化相关性(normalization cross-correlation),用于归一化待匹配目标之间的相关程度,注意这里比较的是原始像素。通过在待匹配像素位置p(px,py)构建3*3邻域匹配窗口,与目标像素位置p’(px+d,py)同样构建邻域匹配窗口的方式建立目标函数来对匹配窗口进行度量相关性,注意这里构建相关窗口的前提是两帧图像之间已经校正到水平位置,即光心处于同一水平线上,此时极线是水平的,否则匹配过程只能在倾斜的极线方向上完成,这将消耗更多的计算资源。
      在这里插入图片描述

    二、实验分析

    NCC 扫平面法重建的视差图

    原图:
    在这里插入图片描述
    实验结果:
    在这里插入图片描述

    1. wid = 3
    2. wid = 5
    1. wid = 7
    1. wid = 9
    1. wid = 11
    1. wid = 13

    小结

    1. 颜色较亮的像素离摄像机近,而颜色较暗的像素离摄像机远。
    2. 当窗口值较小时,结果图的点就越密集,噪声较多。
    3. 细节的效果不是特别好。

    三、总结

    1. 从上述实验结果的分析可以得出,当wid=9wid = 9时,实验结果较为理想。
    2. 视差大的像素离摄像机近,而视差小的像素离摄像机远;即:视差越大,其灰度值也就越大,在视差图像的视觉效果上表现出来就是图像越亮,其视差越小,灰度值也越小,视差图像也就越暗。
    3. 当窗口值较小时,细节体现得较多,窗口值较大时,整体的轮廓会更明显,此时一些细节则不能被体现。
    4. 窗口值过小时,匹配代价区分度过低,在低纹理区域容易出现误匹配,匹配精度较低;随着窗口值增大,匹配区分度逐渐清晰,误匹配区域得到矫正,匹配精度随着窗口值增大而变高。但当窗口值过大时,在深度区域容易出现误匹配。因此窗口值的大小应适中,不宜过大也不宜过小。
    5. 与标准版本相比,高斯版本具有较少的噪声,但缺少很多细节信息。

    四、实验代码

    import stereo
    import scipy.misc
    from PIL import Image
    from pylab import *
    from scipy.ndimage import *
    
    def plane_sweep_ncc(im_l,im_r,start,steps,wid):
    #使用归一化的互相关计算视差图像 """
     m,n = im_l.shape
     # 保存不同求和值的数组
     mean_l = zeros((m,n))
     mean_r = zeros((m,n))
     s = zeros((m,n))
     s_l = zeros((m,n))
     s_r = zeros((m,n))
     # 保存深度平面的数组
     dmaps = zeros((m,n,steps))
     # 计算图像块的平均值
     filters.uniform_filter(im_l,wid,mean_l)
     filters.uniform_filter(im_r,wid,mean_r)
     # 归一化图像
     norm_l = im_l - mean_l
     norm_r = im_r - mean_r
     # 尝试不同的视差
     for displ in range(steps):
     # 将左边图像移动到右边,计算加和
      filters.uniform_filter(roll(norm_l,-displ-start)*norm_r,wid,s) # 和归一化
      filters.uniform_filter(roll(norm_l,-displ-start)*roll(norm_l,-displ-start),wid,s_l)
      filters.uniform_filter(norm_r*norm_r,wid,s_r) # 和反归一化
     # 保存 ncc 的分数
      dmaps[:,:,displ] = s/sqrt(s_l*s_r)
     # 为每个像素选取最佳深度
     return argmax(dmaps,axis=2)
    
    im_l = array(Image.open('C:/Users/Desktop/im1.ppm').convert('L'),'f')
    im_r = array(Image.open('C:/Users/Desktop/im2.ppm').convert('L'),'f')
    # 开始偏移,并设置步长
    steps = 50
    start = 4 
    
    # ncc 的宽度
    wid = 13
    
    res = stereo.plane_sweep_ncc(im_l,im_r,start,steps,wid)
    
    imsave('depth.png',res)
    
    展开全文
  • 立体视觉OpenCV

    2014-07-31 16:55:04
    OpenCV中,双目立体视觉方面的常用函数,翻译
  • 立体视觉注意引导接缝雕刻用于立体图像重定向
  • 双目立体视觉系统(答辩)双目立体视觉系统 项目组成员:何健、晏尧、艾晨 指导老师:蒲秀娟 2011年9月21日 项目答辩 重庆大学第二届科研训练项目 汇报提纲 研究目的和意义 1 系统总体设计硬件选择 2 图像算法和显示...

    双目立体视觉系统(答辩)

    双目立体视觉系统 项目组成员:何健、晏尧、艾晨 指导老师:蒲秀娟 2011年9月21日 项目答辩 重庆大学第二届科研训练项目 汇报提纲 研究目的和意义 1 系统总体设计硬件选择 2 图像算法和显示流程 3 验证 4 心得 5 1 研究目的和意义 应用背景 双目立体视觉系统作用: 双目立体视觉系统可以模仿人眼功能,感知三维世界信息 双目立体视觉系统可用于多场景监控,在工业控制、智能交通、金融、公共安全等应用领域逐渐显示出非常广阔的发展前景 2 系统总体设计及硬件选择 本项目通过详细分析和研究基于DM642双目立体视觉系统,给出软硬件结合的方案 2 系统总体设计及硬件选择 硬件选择 采集模块: CCD摄像头两个 处理模块: DM642 DSP开发板 显示模块: 计算机 3双目立体视觉图像算法和显示流程 具体算法实现 初始化程序中有关参数,变量,调用opencv库,并定义一些相关数组,变量 通过opencv库函数完成摄像机标定,特征提取,立体匹配 完成深度回复和误差纠正 获得立体视觉信息 计算机显示器 3双目立体视觉图像算法和显示流程 摄像机标定 利用摄像机所拍摄到的图像来还原空间中的物体 对图片信息进行二维标定 在二维标定的基础上对图像信息进行三维标定 3双目立体视觉图像算法和显示流程 摄像机标定 标定结果如下图所示: 3双目立体视觉图像算法和显示流程 特征提取 使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征 把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域 本次项目中,提取范围为区域,提取特征为区域的灰度信息 3双目立体视觉图像算法和显示流程 立体匹配 主要采用区域匹配方法,选取一定大小窗口内的灰度分布特征作为匹配基元 利用灰度信息的相关程度,将距离用d(X,Y)表示,X,Y取当前像素的灰度,距离测度d为X,Y之间的绝对差。 3双目立体视觉图像算法和显示流程 深度恢复和误差纠正 通过用于纠正摄像头采集图像的像素丢失和错误,并重建正确的三维图像信息 通过摄像机标定和立体系统标定的方法,求出左右摄像机的内参数和相对旋转矩阵与平移向量 对于左右摄像机所摄同一场景的两幅图像,通过对应点匹配的方法,求出左右图像中的对应点 对于左右图像中的一对对应点,由它们的左右图像坐标和左右摄像机的内参数求出它们的正规化向量 3双目立体视觉图像算法和显示流程 深度恢复和误差纠正 由对应点左右正规化向量的坐标,以场景点在左右摄像机坐标系中的深度值为参数,分别建立从左摄像机光心至左图像点和从右摄像机光心至右图像点的两条投影线方程 由左右正规化向量和摄像机的相对旋转矩阵与平移向量求出两条投影线的公垂线端点在左右摄像机坐标系中的深度值和三维坐标 由公垂线两个端点的坐标求出公垂线中点的坐标,以公垂线中点在左摄像机坐标系中的坐标和公垂线中点在左摄像机坐标系中的坐标作为场景点的三维坐标,完成深度恢复和三维重建 4 验证 系统验证: 系统整机实物图

    展开全文
  • 针对先前的立体图像显著性检测模型未充分考虑立体视觉舒适度和视差图分布特征对显著区域检测的.影响,提出了一种结合立体视觉舒适度因子的显著性计算模型.该模型在彩色图像显著性提取中,首先利用 SLIC 算.法对输入...
  • 双目立体视觉深度相机的工作流程双目立体视觉深度相机详细工作原理理想双目相机成像模型极线约束图像矫正技术基于滑动窗口的图像匹配基于能量优化的图像匹配双目立体视觉深度相机的优缺点--------------------------...

    原标题:深度相机原理揭秘--双目立体视觉

    导读

    为什么非得用双目相机才能得到深度?

    双目立体视觉深度相机的工作流程

    双目立体视觉深度相机详细工作原理

    理想双目相机成像模型

    极线约束

    图像矫正技术

    基于滑动窗口的图像匹配

    基于能量优化的图像匹配

    双目立体视觉深度相机的优缺点

    ---------------------------------------------------

    基于双目立体视觉的深度相机类似人类的双眼,和基于TOF、结构光原理的深度相机不同,它不对外主动投射光源,完全依靠拍摄的两张图片(彩色RGB或者灰度图)来计算深度,因此有时候也被称为被动双目深度相机。比较知名的产品有STEROLABS 推出的 ZED 2K Stereo Camera和Point Grey 公司推出的 BumbleBee。

    ZED 2K Stereo Camera

    为什么非得用双目相机才能得到深度?

    说到这里,有些读者会问啦:为什么非得用双目相机才能得到深度?我闭上一只眼只用一只眼来观察,也能知道哪个物体离我近哪个离我远啊!是不是说明单目相机也可以获得深度?

    在此解答一下:首先,确实人通过一只眼也可以获得一定的深度信息,不过这背后其实有一些容易忽略的因素在起作用:一是因为人本身对所处的世界是非常了解的(先验知识),因而对日常物品的大小是有一个基本预判的(从小到大多年的视觉训练),根据近大远小的常识确实可以推断出图像中什么离我们远什么离我们近;二是人在单眼观察物体的时候其实人眼是晃动的,相当于一个移动的单目相机,这类似于运动恢复结构(Structure from Motion, SfM)的原理,移动的单目相机通过比较多帧差异确实可以得到深度信息。

    但是实际上,相机毕竟不是人眼,它只会傻傻的按照人的操作拍照,不会学习和思考。下图从物理原理上展示了为什么单目相机不能测量深度值而双目可以的原因。我们看到红色线条上三个不同远近的黑色的点在下方相机上投影在同一个位置,因此单目相机无法分辨成的像到底是远的那个点还是近的那个点,但是它们在上方相机的投影却位于三个不同位置,因此通过两个相机的观察可以确定到底是哪一个点。

    双目相机确定深度示意图

    双目立体视觉深度相机简化流程

    下面简单的总结一下双目立体视觉深度相机的深度测量过程,如下:

    1、首先需要对双目相机进行标定,得到两个相机的内外参数、单应矩阵。

    2、根据标定结果对原始图像校正,校正后的两张图像位于同一平面且互相平行。

    3、对校正后的两张图像进行像素点匹配。

    4、根据匹配结果计算每个像素的深度,从而获得深度图。

    欲知详情,且看下面详细介绍。

    双目立体视觉深度相机详细原理

    1

    理想双目相机成像模型

    首先我们从理想的情况开始分析:假设左右两个相机位于同一平面(光轴平行),且相机参数(如焦距f)一致。那么深度值的推导原理和公式如下。公式只涉及到初中学的三角形相似知识,不难看懂。

    理想情况下双目立体视觉相机深度值计算原理

    根据上述推导,空间点P离相机的距离(深度)z=f*b/d,可以发现如果要计算深度z,必须要知道:

    1、相机焦距f,左右相机基线b。这些参数可以通过先验信息或者相机标定得到。

    2、视差d。需要知道左相机的每个像素点(xl, yl)和右相机中对应点(xr, yr)的对应关系。这是双目视觉的核心问题。

    2

    极线约束

    那么问题来了,对于左图中的一个像素点,如何确定该点在右图中的位置?是不是需要我们在整个图像中地毯式搜索一个个匹配?

    答案是:不需要。因为有极线约束(名字听着很吓人)。极线约束对于求解图像对中像素点的对应关系非常重要。

    那什么是极线呢?如下图所示。C1,C2是两个相机,P是空间中的一个点,P和两个相机中心点C1、C2形成了三维空间中的一个平面PC1C2,称为极平面(Epipolar plane)。极平面和两幅图像相交于两条直线,这两条直线称为极线(Epipolar line)。P在相机C1中的成像点是P1,在相机C2中的成像点是P2,但是P的位置事先是未知的。

    我们的目标是:对于左图的P1点,寻找它在右图中的对应点P2,这样就能确定P点的空间位置,也就是我们想要的空间物体和相机的距离(深度)。

    所谓极线约束(Epipolar Constraint)就是指当同一个空间点在两幅图像上分别成像时,已知左图投影点p1,那么对应右图投影点p2一定在相对于p1的极线上,这样可以极大的缩小匹配范围。

    根据极线约束的定义,我们可以在下图中直观的看到P2一定在对极线上,所以我们只需要沿着极线搜索一定可以找到和P1的对应点P2。

    极线约束示意图

    细心的朋友会发现上述过程考虑的情况(两相机共面且光轴平行,参数相同)非常理想,相机C1,C2如果不是在同一直线上怎么办?

    事实上,这种情况非常常见,因为有些场景下两个相机需要独立固定,很难保证光心C1,C2完全水平,即使是固定在同一个基板上也会因为装配的原因导致光心不完全水平。如下图所示。我们看到两个相机的极线不仅不平行,还不共面,之前的理想模型那一套推导结果用不了了,这可咋办呢?

    非理想情况下的极线

    不急,有办法。我们先来看看这种情况下拍摄的两张左右图片吧,如下所示。左图中三个十字标志的点,在右图中对应的极线是右图中的三条白色直线,也就是对应的搜索区域。我们看到这三条直线并不是水平的,如果进行逐点搜索效率非常低。

    左图中三个点(十字标志)在右图中对应的极线是右图中的三条白色直线

    3

    图像矫正技术

    怎么办呢?把不理想情况转化为理想情况不就OK了!这就是图像矫正(Image Rectification)技术。

    图像矫正是通过分别对两张图片用单应(homography)矩阵变换(可以通过标定获得)得到的,的目的就是把两个不同方向的图像平面(下图中灰色平面)重新投影到同一个平面且光轴互相平行(下图中黄色平面),这样就可以用前面理想情况下的模型了,两个相机的极线也变成水平的了。

    图像校正示意图

    经过图像矫正后,左图中的像素点只需要沿着水平的极线方向搜索对应点就可以了(开心)。从下图中我们可以看到三个点对应的视差(红色双箭头线段)是不同的,越远的物体视差越小,越近的物体视差越大,这和我们的常识是一致的。

    图像校正后的结果。红色双箭头线段是对应点的视差

    上面讲到的对于左图的一个点,沿着它在右图中水平极线方向寻找和它最匹配的像素点,说起来简单,实际操作起来却不容易。这是因为上述都是理想情况下的假设。实际进行像素点匹配的时候会发现几个问题:

    1、实际上要保证两个相机完全共面且参数一致是非常困难的,而且计算过程中也会产生误差累积,因此对于左图的一个点,其在右图的对应点不一定恰好在极线上。但是应该是在极线附近,所以搜索范围需要适当放宽。

    2、单个像素点进行比较鲁棒性很差,很容易受到光照变化和视角不同的影响。

    4

    基于滑动窗口的图像匹配

    上述问题的解决方法:使用滑动窗口来进行匹配。如下图所示。对于左图中的一个像素点(左图中红色方框中心),在右图中从左到右用一个同尺寸滑动窗口内的像素和它计算相似程度,相似度的度量有很多种方法,比如 误差平方和法(Sum of Squared Differences,简称SSD),左右图中两个窗口越相似,SSD越小。下图中下方的SSD曲线显示了计算结果,SSD值最小的位置对应的像素点就是最佳的匹配结果。

    滑动窗口匹配原理示意图

    具体操作中还有很多实际问题,比如滑动窗口尺寸。滑动窗口的大小选取还是很有讲究的。下图显示了不同尺寸的滑动窗口对深度图计算结果的影响。从图中我们也不难发现:

    小尺寸的窗口:精度更高、细节更丰富;但是对噪声特别敏感

    大尺寸的窗口:精度不高、细节不够;但是对噪声比较鲁棒

    不同尺寸的滑动窗口对深度图计算结果的影响

    虽然基于滑动窗口的匹配方法可以计算得到深度图,但是这种方法匹配效果并不好,而且由于要逐点进行滑动窗口匹配,计算效率也很低。

    5

    基于能量优化的图像匹配

    目前比较主流的方法都是基于能量优化的方法来实现匹配的。能量优化通常会先定义一个能量函数。比如对于两张图中像素点的匹配问题来说,我们定义的能量函数如下图公式1。我们的目的是:

    1、在左图中所有的像素点和右图中对应的像素点越近似越好,反映在图像里就是灰度值越接近越好,也就是下图公式2的描述。

    2、在 同一张图片里,两个相邻的像素点视差(深度值)也应该相近。也就是下图公式3的描述。

    能量函数

    上述公式1代表的能量函数就是著名的马尔科夫随机场(Markov Random Field)模型。通过对能量函数最小化,我们最后得到了一个最佳的匹配结果。有了左右图的每个像素的匹配结果,根据前面的深度计算公式就可以得到每个像素点的深度值,最终得到一幅深度图。

    双目立体视觉法优缺点

    根据前面的原理介绍,我们总结一下基于双目立体视觉法深度相机的优缺点。

    1

    优点

    1、对相机硬件要求低,成本也低。因为不需要像TOF和结构光那样使用特殊的发射器和接收器,使用普通的消费级RGB相机即可。

    2、室内外都适用。由于直接根据环境光采集图像,所以在室内、室外都能使用。相比之下,TOF和结构光基本只能在室内使用。

    2

    缺点

    1、对环境光照非常敏感。双目立体视觉法依赖环境中的自然光线采集图像,而由于光照角度变化、光照强度变化等环境因素的影响,拍摄的两张图片亮度差别会比较大,这会对匹配算法提出很大的挑战。如下图是在不同光照条件下拍摄的图片:

    不同光照下的图像对比

    另外,在光照较强(会出现过度曝光)和较暗的情况下也会导致算法效果急剧下降。

    2、不适用于单调缺乏纹理的场景。由于双目立体视觉法根据视觉特征进行图像匹配,所以对于缺乏视觉特征的场景(如天空、白墙、沙漠等)会出现匹配困难,导致匹配误差较大甚至匹配失败。

    纹理丰富(左)和纹理缺乏场景(右)

    3、计算复杂度高。该方法是纯视觉的方法,需要逐像素计算匹配;又因为上述多种因素的影响,需要保证匹配结果比较鲁棒,所以算法中会增加大量的错误剔除策略,因此对算法要求较高,想要实现可靠商用难度大,计算量较大。

    4、相机基线限制了测量范围。测量范围和基线(两个摄像头间距)关系很大:基线越大,测量范围越远;基线越小,测量范围越近。所以基线在一定程度上限制了该深度相机的测量范围。

    本公众号后续继续推出一系列关于深度相机原理和技术应用文章,敬请关注。

    注:转载请注明来源,违者必究。

    责任编辑:

    展开全文
  • 双目立体视觉是计算机视觉的一个重要分支,利用计算机技术模拟人类视觉原理,使用计算机被动感知距离的方法,从两个或者多个点观察同一个物体的场景,获取在不同视角下的图像。 根据图像之间像素的匹配关系,通过...
  • 立体视觉定位精度

    2017-10-18 20:21:51
    讲解如何实现立体视觉下的定位,及定位精度分析,进行数学推导及相关模型建立
  • 立体视觉-源码

    2021-02-13 07:08:09
    立体视觉 为什么在这里,为什么现在? 大概在2013年,我和我的朋友有了一个计划,就是根据制作一个立方体。 当然,我们没有所有的卡,也不想购买。 这是一次探索,一次史诗般的冒险。 我们会进行预发行和交易(通常...
  • 由于现场条件的复杂性,主动立体视觉检测系统中的双目立体视觉传感器很难在恶劣的照明环境下获取理想的图像对,或者由于两个摄像机之一损坏而无法正常工作。 为了解决实际问题,提出了一种主动立体视觉检测系统中...
  • 双目立体视觉.zip

    2019-07-24 09:34:38
    利用Halcon来实现 双目立体视觉功能 ,讲解了基本实现原理!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,972
精华内容 1,588
关键字:

立体视觉