在利用前文的方法算出兩張圖片的旋轉矩陣及位移向量以後,下一件事情要做的就是利用 triangulation 估計一個點的深度,或是將兩張圖片做 rectification 使得對應點在兩張圖片中位於同一條水平線上。
Triangulation
第一種方法是用線性方程來估計三維點的位置。假設此三維點為 \(P\),而兩張圖片分別的投影矩陣為 \(M, M'\),在圖片上的位置分別為 \(p, p'\),則有以下關係式:\[MP = p\\M'P = p'\]等號兩邊分別讓 \(p, p'\) 在左邊外積:\[p^\wedge MP = 0 \\ p'^\wedge M'P = 0\]由於只有 P 是未知數,用 SVD 即可解出 P。
第二種方法是用 non-linear optimization 的分法來解。想法是要找出一個點 \(Q\),而其對應在兩張圖片的位置為 \(q, q'\):\[MQ = q\\M'Q = q'\]我們令 loss function 為 \(d^2(p,q) + d^2(p',q')\),也就是 p 至 q 加上 p' 至 q' 的距離,這樣就能估計出這個三維空間中的點 \(Q\) 了。這種方法由於能擴展至多個相機上,因此比較常用。
Rectification
Rectification 的目的是讓一個三維空間中的點在投影兩張圖片上位於同一條水平線上,因此在 stereo matching 時就變得很簡單,因此 rectification 就是要讓兩個相機的坐標系完全對齊,只有 x 分量的差異,y 與 z 分量都為零。
假設一開始兩個相機的坐標系的位移向量為 \(t = [x, y, z]^T\),rectification 的目標是找到一個旋轉矩陣 \(R\) 使得 \(Rt = [k, 0, 0]^T\),也就是只剩下 x 方向的分量。以下介紹建構此旋轉矩陣的方法:
- 令 \(e_1 = \frac{T}{\begin{Vmatrix}
T
\end{Vmatrix}}\) - 令 \(e_2 = \frac{1}{\sqrt{x^2+y^2}}[-y, x, 0]^T\)
- 令 \(e_3 = e_1 \times e_2\)
- 令 \(R = \begin{bmatrix}
e_1^T\\
e_2^T\\
e_3^T
\end{bmatrix}\) - 利用此矩陣旋轉兩個坐標系,最後再調整 scale 就完成了。
這個方法有用是因為 \(R\) 的第二第三行都垂直於 \(t\),因此 \(Rt\) 只會剩下 x 方向的分量。
沒有留言:
張貼留言