圖像校正(Image Rectification)——使得在對極線上尋找對應點更加容易

圖像校正——使得在對極線上尋找對應點更加容易
2019/10/27 FesianXu

前言

我們在[1]中曾經談到了如何在對極線上去尋找對應點,這樣會使得算法更魯棒,而且速度更快。在本文中,我們將會繼續介紹一種稱之爲圖像矯正的方法,通過這種方法,我們可以在對極線的基礎上,使得尋找對應點變得更爲容易。

如有謬誤,請聯繫指正。轉載請註明出處。

\nabla 聯繫方式:
e-mail: [email protected]
QQ: 973926198
github: https://github.com/FesianXu


爲什麼我們需要圖像矯正

我們在[1]曾經聊到了在對極線上尋找對應點的方法,如Fig 1.1所示。這種方法將對應點可能的範圍約束到了一條直線上,而不是一個二維平面,這樣大大減小了搜索空間。同時,我們也在[1]中聊過,每個對極面都是會經過基線的,每個對極線也是會經過對應的對極點的,正是因爲如此,其實對於單張圖的對極線組來說,如果延伸每條對極線,我們會發現每條對極線都會匯聚於對極點上,如Fig 1.2所示。也正是因爲如此,我們得到的對極線們都不是平行的,如Fig 1.3所示。

在這裏插入圖片描述

Fig 1.1 在對極線l和l'上尋找對應點。

在這裏插入圖片描述

Fig 1.2 對極線的延長線將會匯聚在對極點上。

在這裏插入圖片描述

Fig 1.3 兩張圖對應的對極線對(epipolar lines pair),我們發現這兩組對極線都是不平行的。

我們在後續的處理中,將會發現不平行的對極線會使得尋找對極點的運算變得複雜,我們期望的是, 如果每對對極線都是平行的,那將會大大減少後續算法的複雜度,特別是在求視差時,平行的對極線將會提供極大的便利。 理想的對極線對的效果如Fig 1.4所示。我們後續就討論如何才能從不平行的對極線轉換成平行的,也就是 圖像矯正(image rectification) 的具體操作。

在這裏插入圖片描述

在這裏插入圖片描述

Fig 1.4 上圖表示的是未經過圖像矯正的對極線配對,我們發現其是不平行的。下圖是經過圖像矯正的對極線配對,我們發現其平行了,這個效果正是我們所期望的。

圖像矯正

需要明確的是,進行圖像矯正之前需要知道相機的內參數和外參數[4]。

我們首先要知道,爲什麼我們的對極線對會不平行呢?如圖Fig 2.1所示,其不平行的原因是因爲我們的成像平面沒有共面(coplanar),那麼自然地,我們的直接做法就是矯正我們的成像平面,使得其共面,效果如圖Fig 2.2的黃色面所示。其總體效果,如Fig 2.3所示,我們可以發現,通過這種手段,我們的對應點的搜索空間進一步縮小到了水平線上,只用一個水平線上的參數xx表示其距離就可以描述對應點了,這樣其實是大大減少了運算量的。

在這裏插入圖片描述

Fig 2.1 使得對極線不平行的根本原因是我們的不同攝像機的成像平面之間並不是共面的。

在這裏插入圖片描述

Fig 2.2 通過矯正成像平面到共面,我們可以使得對極線對平行。

在這裏插入圖片描述

Fig 2.3 通過矯正到(2)的情況,我們的搜索空間進一步減少了。

我們後續具體分析這個矯正過程,我們要想怎麼樣才能將成像平面矯正到共面呢?我們觀察圖Fig 2.4,我們延伸射線POPOPOPO^{\prime}分別得到PPˉ,PPˉP\bar{P}, P\bar{P}^{\prime},使得OO//PˉPˉOO^{\prime} // \bar{P}\bar{P}^{\prime},同時,我們確保O,OO, O^{\prime}到平面ˉ,ˉ\bar{\prod}, \bar{\prod}^{\prime}的距離相同,那麼我們的平面ˉ,ˉ\bar{\prod}, \bar{\prod}^{\prime}就是期望得到的矯正成像平面了。其實這個也不難理解,因爲每個對極面都是經過基線的,而基線平行於ˉ,ˉ\bar{\prod}, \bar{\prod}^{\prime},那麼ep,epep,e^{\prime}p^{\prime}在基線上的投影必然是平行於PˉPˉ\bar{P}\bar{P}^{\prime}的,同時,我們保證了兩個焦點到兩個平面的距離相同,確保了其是ˉ,ˉ\bar{\prod}, \bar{\prod}^{\prime}的投影。

在這裏插入圖片描述

Fig 2.4 平行對極線(粉色)平行於基線(黑色OO'),而且焦點分別到其對應的成像平面的距離相同。

我們爲什麼要加上這個焦點到兩個矯正後的成像平面的距離相同這個約束呢?讓我們看一個例子。

在如圖Fig 2.5的系統中,我們假設兩個成像平面是共面的,其焦點之間的距離OO=dOO^{\prime} = d,兩個攝像頭之間不存在有旋轉關係,那麼我們可以知道其相機參數爲:

R=IT=[d,0,0]TE=[T×]R=[00000d0d0](2.1) \begin{aligned} \mathbf{R} &= \mathbf{I} \\ \mathbf{T} &= [-d, 0, 0]^{\mathrm{T}} \\ \mathbf{E} &= [\mathbf{T}_{\times}]\mathbf{R} = \left[ \begin{matrix} 0 & 0 & 0 \\ 0 & 0 & d \\ 0 & -d & 0 \end{matrix} \right] \end{aligned} \tag{2.1}

在這裏插入圖片描述

Fig 2.5 在共面的成像平面中的建模。

從[1]中提到的對極約束的代數表達形式,我們有:

pEp=0[x,y,f][00000d0d0][xyf]=0y=y(2.2) \begin{aligned} \mathbf{p}^{\prime}\mathbf{E}\mathbf{p} &= 0 \\ &\Rightarrow [x^{\prime}, y^{\prime}, f] \left[ \begin{matrix} 0 & 0 & 0 \\ 0 & 0 & d \\ 0 & -d & 0 \end{matrix} \right] \left[ \begin{matrix} x \\ y \\ f \end{matrix} \right] = 0 \\ & \Rightarrow y = y^{\prime} \end{aligned} \tag{2.2}

從中我們發現,我們必須引入這個約束去約束成像平面的位置。

在這裏插入圖片描述

我們知道極點ee是本徵矩陣的零空間向量,也就是說我們有Ee=0\mathbf{E}e = 0,我們可以解出:
[00000d0d0][100]=0 \left[ \begin{matrix} 0 & 0 & 0 \\ 0 & 0 & d \\ 0 & -d & 0 \end{matrix} \right] \left[ \begin{matrix} 1 \\ 0 \\ 0 \end{matrix} \right] = 0
我們如果從齊次座標的角度去看待e=[100]e = \left[ \begin{matrix} 1 \\ 0 \\ 0 \end{matrix} \right] 那麼我們知道其實這個時候極點是在無限遠處了。(關於齊次座標系,見[2,3])

於是,其實矯正成像平面的後果就是,我們的極點被挪到了無限遠處,這個和我們圖Fig 1.2的推論相同。

在這裏插入圖片描述

Fig 2.6 經過矯正之後,圖像的極點被移到了無限遠處。

我們到現在算是對圖像矯正有了直觀上的印象,接下來我們嘗試用算法去描述這個過程。圖像矯正算法主要分四步。

  1. 用旋轉矩陣Rrec\mathbf{R}_{\mathrm{rec}}旋轉左相機,使得左成像平面的極點到無限遠處。

  2. 用和第一步相同的旋轉矩陣旋轉右相機。

  3. 用外參數中的R\mathbf{R}旋轉繼續旋轉右相機。

  4. 對座標系調整尺度。

我們首先需要確定旋轉矩陣Rrec\mathbf{R}_{\mathrm{rec}}。爲了確定這個矩陣,我們需要構造一組彼此正交的單位向量e1,e2,e3\mathbf{e}_1, \mathbf{e}_2, \mathbf{e}_3。我們一般選擇以其中一個焦點爲原點構建,選擇OO=T=(Tx,Ty,Tz)TOO^{\prime} = \mathbf{T} = (T_x, T_y, T_z)^{\mathrm{T}}作爲一個基底,然後進行單位化,我們有:
e1=TT \mathbf{e}_1 = \dfrac{\mathbf{T}}{||\mathbf{T}||}
構造e2\mathbf{e}_2則只有和e1\mathbf{e}_1正交併且是單位向量這約束,因此比較任意,如:
e2=1Tx2+Ty2(Ty,Tx,0)T \mathbf{e}_2 = \dfrac{1}{\sqrt{T_x^2+T_y^2}} (-T_y, T_x, 0)^{\mathrm{T}}
容易定義:
e3=e1×e2 \mathbf{e}_3 = \mathbf{e}_1 \times \mathbf{e}_2

在這裏插入圖片描述

Fig 2.7 構建出正交的單位向量,如綠色線段所示。

因此旋轉矩陣爲:
Rrec=(e1Te2Te3T) \mathbf{R}_{\mathrm{rec}} = \left(\begin{matrix}\mathbf{e}_1^{\mathrm{T}} \\ \mathbf{e}_2^{\mathrm{T}} \\\mathbf{e}_3^{\mathrm{T}}\end{matrix}\right)
然後設置左右攝像機的旋轉矩陣
Rl=RrecRr=RRrec \begin{aligned}\mathbf{R}_{l} &= \mathbf{R}_{\mathrm{rec}} \\\mathbf{R}_{r} &= \mathbf{R} \mathbf{R}_{\mathrm{rec}}\end{aligned}
其中的R\mathbf{R}是外參數的旋轉矩陣。

隨後進行旋轉和調整座標系尺度,如:對於左相機的點pl=[x,y,f]T\mathbf{p}_l = [x,y,f]^{\mathrm{T}},計算出Rlpl=[x,y,z]\mathbf{R}_l \mathbf{p}_l = [x^{\prime},y^{\prime},z^{\prime}],隨後計算器調整後的座標系,最終有:
pl=fz[x,y,z] \mathbf{p}_l^{\prime} = \dfrac{f}{z^{\prime}} [x^{\prime},y^{\prime},z^{\prime}]
對於右相機,其操作相同。

最後的矯正結果展示如:

在這裏插入圖片描述


Reference

[1]. https://blog.csdn.net/LoseInVain/article/details/102665911

[2]. Hartley R, Zisserman A. Multiple View Geometry in Computer Vision[J]. Kybernetes, 2008, 30(9/10):1865 - 1872.

[3]. https://blog.csdn.net/LoseInVain/article/details/102756630

[4]. https://blog.csdn.net/LoseInVain/article/details/102632940

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章