在已知的影像座標的情況,如果要計算出該物體與相機在影像拍攝時之距離 (depth),單靠一張影像是沒辦法計算出來的。

假設影像座標上的點為 Pc,C 為相機內部參數矩陣,P 為該相機的 3 維相機座標點,則 P1 經過 C1 作用後,所得到的座標點為 Pc1,其矩陣表示法為:

其中 P 以齊次座標 (Homogeneous Coordinates) 表示為 (X, Y, Z, W)T

但是實際上,有辦法知道的影像座標為 (u1/w1, v1/w1) = (u'1, v'1),因為在影像中,只會知道該點的平面座標:


假設 C1 由三個列向量組成:r1, r2, r3
則從上述的矩陣表示法,可以推出以下兩個等式:
u'1 = u1/w1 = (r1 * P) / (r3 * P) => u'1 * (r3 * P) - (r1 * P) = 0
v'1 = v1/w1 = (r2 * P) / (r3 * P) => v'1 * (r3 * P) - (r2 * P) = 0

上述兩個等式中,u'1, v'1 已知,且 r1, r2, r3 也已知,但 P(X, Y, Z, W) 未知,在有四個未知數的情況下,至少需要四個等式才能求完整解,以一台相機來說,如果對某個特定點成像,可以得到兩個等式,因此在上述條件下,至少需要兩台內部參數已知,且相對位置也已知的相機,對同一特定點拍照,才能得到四個等式,以求出 P 之解。

以上同時也說明了為何大部分動物都具有雙眼視覺的原因,為的就是能儘量正確定位出所見物體的距離。




如果確定使用兩台 Camera ,其 depth 的值可以利用相似三角形的特性來計算:

上圖中 O 與 O' 分別為左、右兩台相機的焦點; x 及 x' 分別是同一 feature 在左、右影像的成像位置,也就是相對於各自焦點,在 x 軸方向的座標位置。
假設該 feature 的以左側相機的焦點為原點,其左側相機座標為 (X,Y, Z),左右兩相機的焦距皆為 f,則利用相似三角形原理,在左側相機可以得到:
f / x = Z / X => X = Zx / f
在右側相機可以得到:
f / x' = Z / (X-B) => Zx' = f (X-B) = fX -fB, 代入左側相機得到的 X
=> Zx' = f (Zx / f) - fB = Zx -fB
=> fB = Zx - Zx'
=> Z = fB / (x - x')

要注意的是這邊的 x 及 x' 是座標值,也就是具有方向性,向右為正,向左為負,不是單純的長度單位。

而 (x - x') 的值也稱為 disparity,因為 B 及 f 的值在兩張影像的比較中是不會改變的,所以影像中物體的 depth 只會跟 disparity 的值有關,並且 depth 的值會與 disparity 的值成反比。
所以只要能提供兩張影像,並不需要真正知道 B 及 f 的值,即能計算影像中物體的相對深度。

OpenCV 所提供 StereoMacher 相關的函式庫,即是如此,只要輸入左、右兩張影像,便可計算出該影像的 depth map。




Pinhole Camera 相關文章:
相機座標成像原理
相機校正 (Camera Calibration)
3D 深度預測 (3D Depth Estimation)
Epipolar Geometry
Homography



Reference

The Pinhole Camera
Depth Map from Stereo Images

文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知,謝謝。
創作者介紹

拾人牙慧點滴

silverwind1982 發表在 痞客邦 PIXNET 留言(0) 人氣()