【立体视觉(四)】之极线校正与双目视觉
- 一、极线校正
 - 一)Fusiello校正法
 - 1. 转换矩阵计算
 - 2. 核线影像生成
 
- 二、双目视觉
 
此为个人学习笔记,在各处借鉴了不少好图好文(参考文献在文末),主要是对相关知识进行梳理,以期形成自己的体系。文字表述东拼西凑,符号公式手动输入,若有错误烦请指出。
一、极线校正

 在前面学习了对极几何和对极约束,通过对极约束,可知对于左视图的一个像素点  
     
      
       
        
        
          p 
         
        
          1 
         
        
       
      
        p_1 
       
      
    p1 ,可以计算出右视图中  
     
      
       
        
        
          p 
         
        
          1 
         
        
       
      
        p_1 
       
      
    p1 同名点  
     
      
       
        
        
          p 
         
        
          2 
         
        
       
      
        p_2 
       
      
    p2 所在的那条极线  
     
      
       
        
        
          l 
         
        
          2 
         
        
       
      
        l_2 
       
      
    l2 。这就为我们确定  
     
      
       
        
        
          p 
         
        
          2 
         
        
       
      
        p_2 
       
      
    p2 坐标大大减少了搜索空间,如果对于左视图的每个待匹配像素,都去计算它对应的那条极线,在待匹配像素很多的时候,可想而知计算量会非常大。
通过观察可以发现:极线 l 1 l_1 l1 和极线 l 2 l_2 l2 (可以称极线 l 1 l_1 l1 和极线 l 2 l_2 l2 为一个极线对)都在同一极平面上,也就是说极线 l 1 l_1 l1 和极线 l 2 l_2 l2 上的像素都满足同一个对极约束公式。当极平面绕基线 O 1 O 2 O_1O_2 O1O2 转动时,所得的极线可以涵盖视图上所有像素点。
如果将极线上的像素重新排列,把同一极线上的像素排列到同一行,那么我们就可以通过行号来确定同一极线对的像素,此时左视图像素点 p 1 p_1 p1 的同名点 p 2 p_2 p2 一定在相同行号的那一行像素中,它们只有列坐标差异,称之为视差( d = c o l ( p 1 ) − c o l ( p 2 ) d=col(p_1)-col(p_2) d=col(p1)−col(p2) )。
这就是极线校正做的工作,更专业的解释:极线校正就是经过一系列变换把双目立体视觉几何结构校正为平视双目标准几何结构,即左右相机的成像平面在同一个平面上且是垂直对齐的。

一)Fusiello校正法
极线校正使得稠密匹配变得简单许多。极线校正方法可以分为非定标校正和定标校正。非定标校正是指不需要相机标定的
 内外参数即可进行校正如Hartley 算法,定标校正则是利用预先得到的相机内外参数完成校正,如Fusiello 法、Bouguet 法。这里先学习一下简单易懂易实现的Fusiello校正法。
极线校正就是经过一系列变换(旋转相机和重新定义像平面)把双目立体视觉几何结构校正为平视双目标准几何结构。本质是重新定义投影矩阵 M = K [ R ∣ t ] = K [ R ∣ − − R O ] M=K[R|t]=K[R|--RO] M=K[R∣t]=K[R∣−−RO],其中矩阵 K 、 R 、 O K、R、O K、R、O 分别表示相机的内参矩阵、旋转矩阵和相机光心坐标。
Fusiello校正法通过旋转相机①重新定义旋转矩阵 R n R_n Rn,让新的像平面平行于相机基线。②重新定义像平面内参 K n K_n Kn,使双相机有同样的内参,保证左右像平面共面。(这里的下标 “ n _n n” 取 “new” 之意,下同。)

 如上图所示,图像坐标系  
     
      
       
       
         u 
        
       
      
        u 
       
      
    u 轴与基线  
     
      
       
        
        
          O 
         
        
          1 
         
        
        
        
          O 
         
        
          2 
         
        
       
      
        O_1O_2 
       
      
    O1O2 平行,左右影像对应的焦距  
     
      
       
       
         f 
        
       
      
        f 
       
      
    f 和主点坐标相同。
1. 转换矩阵计算
1)计算旋转矩阵 R n R_n Rn
旋转相机使左右像平面互相平行且均平行于相机基线,其本质在于重新定义相机坐标系,Fusiello 方法所定义的新坐标系如下:
(1)为了保证像平面与相机基线平行,新相机坐标系的X 轴需与基线平行,即  
     
      
       
       
         X 
        
       
      
        X 
       
      
    X 轴的基向量如下式所示:
  
      
       
        
         
         
           r 
          
         
           x 
          
         
        
          = 
         
        
          ( 
         
         
         
           O 
          
         
           1 
          
         
        
          − 
         
         
         
           O 
          
         
           2 
          
         
        
          ) 
         
        
          / 
         
        
          ∣ 
         
        
          ∣ 
         
         
         
           O 
          
         
           1 
          
         
        
          − 
         
         
         
           O 
          
         
           2 
          
         
        
          ∣ 
         
        
          ∣ 
         
        
       
         r_x=(O_1-O_2)/||O_1-O_2|| 
        
       
     rx=(O1−O2)/∣∣O1−O2∣∣
 (2)为了使纠正后的影像范围与原影像范围尽可能保持一致,新相机坐标系的Y 轴采用与原相机坐标系的  
     
      
       
       
         Y 
        
       
      
        Y 
       
      
    Y 轴相近的方向,即  
     
      
       
       
         Y 
        
       
      
        Y 
       
      
    Y 轴的基向量如下式所示:
  
      
       
        
         
         
           r 
          
         
           y 
          
         
        
          = 
         
         
         
           R 
          
         
           Z 
          
         
        
          × 
         
         
         
           r 
          
         
           x 
          
         
        
       
         r_y=R_Z \times r_x 
        
       
     ry=RZ×rx
 
     
      
       
        
        
          R 
         
        
          z 
         
        
       
      
        R_z 
       
      
    Rz 表示远相机坐标系的  
     
      
       
       
         Z 
        
       
      
        Z 
       
      
    Z 轴。
 (3)新相机坐标系的Z 轴分别与  
     
      
       
       
         X 
        
       
      
        X 
       
      
    X 轴、 
     
      
       
       
         Y 
        
       
      
        Y 
       
      
    Y 轴正交,即  
     
      
       
       
         Z 
        
       
      
        Z 
       
      
    Z 轴的基向量如下式所示:
  
      
       
        
         
         
           r 
          
         
           z 
          
         
        
          = 
         
         
         
           r 
          
         
           x 
          
         
        
          × 
         
         
         
           r 
          
         
           y 
          
         
        
       
         r_z=r_x \times r_y 
        
       
     rz=rx×ry
 (4)根据新相机坐标系的三个基向量获得最后的旋转矩阵  
     
      
       
        
        
          R 
         
        
          n 
         
        
       
      
        R_n 
       
      
    Rn:
R n = [ r x T r y T r z T ] R_n=\begin{bmatrix} r_x^T \\r_y^T\\r_z^T \end{bmatrix} Rn= rxTryTrzT 
2)计算内参矩阵 K n K_n Kn
获得旋转矩阵后,可依此对左右像平面进行旋转,旋转后的像平面互相平行且均平行于基线,但是相机焦距的不同会导致两平面不共面,因此需要统一相机参数,即计算统一的新内参矩阵 K n K_n Kn。为了尽可能保证新内参矩阵与原内参矩阵保持一致,新内参矩阵使用左右影像原内参矩阵的平均数,并将其中的倾斜因子设定为0,即:
 
      
       
        
         
         
           K 
          
         
           n 
          
         
        
          = 
         
        
          ( 
         
         
         
           K 
          
         
           l 
          
         
        
          + 
         
         
         
           K 
          
         
           r 
          
         
        
          ) 
         
        
          / 
         
        
          2 
         
        
       
         K_n=(K_l+K_r)/2 
        
       
     Kn=(Kl+Kr)/2
 将计算获得的  
     
      
       
        
        
          R 
         
        
          n 
         
        
       
      
        R_n 
       
      
    Rn 和  
     
      
       
        
        
          K 
         
        
          n 
         
        
       
      
        K_n 
       
      
    Kn 进行组合, 获得核线纠正后新的投影矩阵:
  
      
       
        
         
         
           M 
          
         
           n 
          
         
        
          = 
         
         
         
           K 
          
         
           n 
          
         
        
          [ 
         
         
         
           R 
          
         
           n 
          
         
        
          ∣ 
         
        
          − 
         
         
         
           R 
          
         
           n 
          
         
        
          O 
         
        
          ] 
         
        
       
         M_n=K_n[R_n|-R_nO] 
        
       
     Mn=Kn[Rn∣−RnO]
3)计算转换矩阵 T T T
接下来就是校正过程,使用转换矩阵  
     
      
       
       
         T 
        
       
      
        T 
       
      
    T 来表达了某一像素在核线纠正前后图像像素坐标之间的转换关系,可以根据核线纠正前后的投影矩阵  
     
      
       
       
         M 
        
       
      
        M 
       
      
    M 和  
     
      
       
        
        
          M 
         
        
          n 
         
        
       
      
        M_n 
       
      
    Mn 计算获得,具体方法如下:
 假设空间中的一点  
     
      
       
       
         P 
        
       
      
        P 
       
      
    P ,该点在新旧投影矩阵下的表达式为:
  
      
       
        
        
          { 
         
         
          
           
            
             
             
               λ 
              
             
               p 
              
             
               = 
              
             
               M 
              
             
               P 
              
             
               = 
              
             
               [ 
              
             
               Q 
              
             
               ∣ 
              
             
               − 
              
             
               Q 
              
             
               O 
              
             
               ] 
              
             
               P 
              
             
            
           
          
          
           
            
             
              
              
                λ 
               
              
                n 
               
              
              
              
                p 
               
              
                n 
               
              
             
               = 
              
              
              
                M 
               
              
                n 
               
              
             
               P 
              
             
               = 
              
             
               [ 
              
              
              
                Q 
               
              
                n 
               
              
             
               ∣ 
              
             
               − 
              
              
              
                Q 
               
              
                n 
               
              
             
               O 
              
             
               ] 
              
             
               P 
              
             
            
           
          
          
           
            
             
             
               Q 
              
             
               = 
              
             
               K 
              
             
               P 
              
             
            
           
          
          
           
            
             
              
              
                Q 
               
              
                n 
               
              
             
               = 
              
              
              
                K 
               
              
                n 
               
              
              
              
                R 
               
              
                n 
               
              
             
            
           
          
         
        
       
         \begin{cases} \lambda p=MP=[Q|-QO]P\\ \lambda_n p_n=M_nP=[Q_n|-Q_nO]P \\ Q=KP\\ Q_n=K_nR_n \\ \end{cases} 
        
       
     ⎩ 
              ⎨ 
              ⎧λp=MP=[Q∣−QO]Pλnpn=MnP=[Qn∣−QnO]PQ=KPQn=KnRn
其中, 
     
      
       
       
         P 
        
       
      
        P 
       
      
    P 表示点  
     
      
       
       
         P 
        
       
      
        P 
       
      
    P 的齐次坐标表达式, 
     
      
       
        
        
          p 
         
        
          n 
         
        
       
      
        p_n 
       
      
    pn 和  
     
      
       
       
         p 
        
       
      
        p 
       
      
    p 表示点  
     
      
       
       
         P 
        
       
      
        P 
       
      
    P 投影到新旧像平面下的齐次坐标,由于该方程为齐次方程,将系数  
     
      
       
       
         λ 
        
       
      
        \lambda 
       
      
    λ 和  
     
      
       
        
        
          λ 
         
        
          n 
         
        
       
      
        \lambda_n 
       
      
    λn 均设置为1,并将上式展开可得:
  
      
       
        
        
          { 
         
         
          
           
            
             
             
               p 
              
             
               = 
              
             
               Q 
              
             
               ( 
              
             
               P 
              
             
               − 
              
             
               O 
              
             
               ) 
              
             
            
           
          
          
           
            
             
              
              
                p 
               
              
                n 
               
              
             
               = 
              
              
              
                Q 
               
              
                n 
               
              
             
               ( 
              
             
               P 
              
             
               − 
              
             
               O 
              
             
               ) 
              
             
            
           
          
         
        
       
         \begin{cases} p=Q(P-O)\\ p_n=Q_n(P-O)\\ \end{cases} 
        
       
     {p=Q(P−O)pn=Qn(P−O)
 根据旧影像坐标  
     
      
       
       
         p 
        
       
      
        p 
       
      
    p 和转换矩阵  
     
      
       
       
         T 
        
       
      
        T 
       
      
    T 计算新影像坐标  
     
      
       
        
        
          p 
         
        
          n 
         
        
       
      
        p_n 
       
      
    pn 的公式为:  
     
      
       
        
        
          p 
         
        
          n 
         
        
       
         = 
        
       
         T 
        
       
         p 
        
       
      
        p_n= Tp 
       
      
    pn=Tp ,即  
     
      
       
        
        
          Q 
         
        
          n 
         
        
       
         ( 
        
       
         P 
        
       
         − 
        
       
         O 
        
       
         ) 
        
       
         = 
        
       
         T 
        
       
         Q 
        
       
         ( 
        
       
         P 
        
       
         − 
        
       
         O 
        
       
         ) 
        
       
      
        Q_n(P-O)= TQ(P-O) 
       
      
    Qn(P−O)=TQ(P−O),由此可得转换矩阵  
     
      
       
       
         T 
        
       
      
        T 
       
      
    T:
  
      
       
        
        
          T 
         
        
          = 
         
         
         
           Q 
          
         
           n 
          
         
         
         
           Q 
          
          
          
            − 
           
          
            1 
           
          
         
        
       
         T=Q_nQ^{-1} 
        
       
     T=QnQ−1
 转换矩阵表征核线纠正前后同一像素之间的转换关系,根据原影像中的某一像素的图像像素坐标和转换矩阵,可以计算获得其在核线影像中对应的图像像素。
 对于两个相机,根据公式可以计算各自的转换矩阵  
     
      
       
        
        
          T 
         
        
          1 
         
        
       
         、 
        
        
        
          T 
         
        
          2 
         
        
       
      
        T_1、T_2 
       
      
    T1、T2。
2. 核线影像生成
计算获得转换矩阵  
     
      
       
       
         T 
        
       
      
        T 
       
      
    T 后,可以得到某一像素点  
     
      
       
       
         p 
        
       
      
        p 
       
      
    p 核线纠正前后的图像坐标关系式为:
  
      
       
        
        
          λ 
         
        
          p 
         
        
          = 
         
        
          λ 
         
         
         
           [ 
          
          
           
            
             
             
               x 
              
             
            
           
           
            
             
             
               y 
              
             
            
           
           
            
             
             
               1 
              
             
            
           
          
         
           ] 
          
         
        
          = 
         
         
         
           T 
          
          
          
            − 
           
          
            1 
           
          
         
         
         
           [ 
          
          
           
            
             
              
              
                x 
               
              
                n 
               
              
             
            
           
           
            
             
              
              
                y 
               
              
                n 
               
              
             
            
           
           
            
             
             
               1 
              
             
            
           
          
         
           ] 
          
         
        
          = 
         
         
         
           T 
          
          
          
            − 
           
          
            1 
           
          
         
         
         
           p 
          
         
           n 
          
         
        
       
         \lambda p=\lambda \begin{bmatrix} x\\y\\1 \end{bmatrix}=T^{-1} \begin{bmatrix} x_n\\y_n\\1 \end{bmatrix}=T^{-1}p_n 
        
       
     λp=λ 
              xy1 
              =T−1 
              xnyn1 
              =T−1pn
生成最终的核线影像具体步骤如下:首先建立一个新的影像,影像尺寸与原影像保持一致,遍历新影像中的每一个像素点,根据上式计算其在原影像中对应的像素坐标,并采用该像素的灰度值为其赋值。由于该坐标不一定为整数,因此需要进行灰度内插(常用双线性插值)。若影像为多波段(通道)影像,则分别对各波段(通道)进行内插即可。

二、双目视觉
这里简要介绍一下双目视觉。双目视觉是模拟人类视觉原理,使用计算机被动感知距离的方法。从两个或者多个点观察一个物体,获取在不同视角下的图像,根据图像之间像素的匹配关系,通过三角测量原理计算出像素之间的偏移来获取物体的三维信息。
 
利用双目视觉(相机)三维重建(估计深度)步骤如下:
- 双目标定
 - 双目校正
 - 双目匹配
 
双目标定是为了获取两个相机的内参(焦距,图像中心,畸变系数等)和外参(R(旋转)矩阵T(平移)矩阵。标定相关内容已经在上一文中学习了。注意双相机标定时,其中一台相机(一般为右相机)的外参是需要相对于另一台相机(左相机)的相对外参。
双目校正就是畸变校正加上核线校正(畸变校正在核线校正前)。
双目匹配(立体匹配)是双目深度估计的核心部分,即将左右相机图像上的对应点匹配起来,由此计算视差,得到视差图之后,可以利用相机标定得到的外参将视差值转换成深度值,从而获取目标场景的点云信息以进行场景的三维重建(这部分内容很多,后面学习)。
参考:
 [1] Stereo vision: Algorithms and applications
 [2] 李晟昊. 基于SURF约束的影像半全局密集匹配方法研究与应用[D].中国矿业大学,2022
 [3] 立体视觉入门指南(6):对级约束与Fusiello法极线校正
 [4] Epipolar Rectification



![[VPN]华为SecoClient客户端Linux使用](https://img-blog.csdnimg.cn/43f6fc7951e0418499a71613b6378632.png)















