真實世界的物體,在針孔相機成相模型(Pinhole Camera Model) 下,其座標變化情況為:
可以任意點為原點的物體 (三維世界)座標 須先轉換為以相機的焦點為原點 (三維相機)座標,接著再此 (三維相機)座標 轉換為相機成像平面上的 (二維影像)座標,這之間的座標轉換過程,理論上,就是 真實物體 在 相機 的成像情況。




針孔相機的成像

在針孔相機的成像過程中,物體所折射的光線,通過 Pinhole 後,光線投影在底片上,會在底片上形成一個左右相反、上下顛倒的該物體影像,如下圖所示:

Pinhole_Camera_001

圖中相關的參數,分別為:
2-D image: 二維影像
Image plane: 成像平面
Focal point: 焦點,也就是針孔相機(Pinhole Camera) 中的針孔(Pinhole)
Virtual image plane: 虛擬成像平面,只是為了討論上比較方便,實際上不會存在
3-D object: 三維物體
Focal length: 焦距,焦點到成像平面的距離, 與 焦點到虛擬成像平面 的距離相同




何謂世界座標?

在往下繼續討論座標點之前,有個問題要先處理,以下圖為例,如果要試著定出這個樹的 A 點的 3D 座標,該如何定:

Pinhole_Camera_002
是應該由右側的相機為原點?
還是該以左側的相機為原點?
還是該以圖片的最左下方為原點來計算座標?

理論上這三種方式是都可以的,只要有個一致的座標,供任何對此影像拍照的 Camera 使用即可。

也就是說,任意的相機在拍攝影像時,把 世界座標 轉換成相對於該台相機位置的 相機座標 後,就可以計算出物體會在該台相機的成像平面上的哪個位置成像。

如果在定義世界座標時,就是以該台相機的焦點為原點,則該 世界座標 同時也是該台相機的 相機座標。




為什麼需要世界座標?

會需要世界座標的原因在於為了讓同一點 A ,經由不同方位的相機所拍攝,相機彼此之間有一個共同的座標計算方式。




世界座標 跟 相機座標 的關係

先設定 A 點的世界座標為 (X, Y, Z),接著在世界座標經過特定一次的 "位移" 及 "旋轉" 之後,轉換成相機座標,也就是以相機焦點為原點的座標。

這邊的基本觀念是:任意不同方向、不同位置的兩個外觀相同的物體,任一物體經過特定一次的位移及旋轉後,就可以達到跟另一個物體具有相同的方向、位置;把這個觀念延伸,可以理解為物體的原點可以改變為空間上的任意一點,而座標值的轉換,只要經過特定一次的位移及旋轉後,就可以得到以該任意點為原點的座標值。

也就是說,物體的世界座標經過特定的一次位移跟旋轉後,就可以轉換成以 相機焦點 為原點的 相機座標。


以上圖所示,原本的座標值是以圖片的左下方為原點,經過特定的位移及旋轉之後,就轉換成以 相機焦點 為原點的 相機座標。

令位移為 T 為 3x1 矩陣 - (Tx, Ty, Tz),表示在 x, y, z 軸的位移,旋轉為 R 為 3x3 的旋轉矩陣。

又因為在矩陣的計算上,世界座標會先將經過旋轉的作用,才加上位移的作用,所以在矩陣的表示法上,所位移的 T 需要經過旋轉矩陣的作用,矩陣表示法如下:

其中,R: r11 ~ r33; t = RT: t1 ~ t3

R 為 3x3 矩陣,T 為 3x1 矩陣,RT 還是 3x1 矩陣,而 [R | RT] 合併起來,就是一個 3x4 矩陣,這個 3x4 矩陣的專有名詞為 外部參數矩陣 (Extrinsic Parameter Matrix)。

簡單說,外部參數矩陣,就是由 世界座標 轉換成 相機座標 所需要的 位移 及 旋轉 所組成。

世界座標 轉換成 相機座標 後,所得到的座標是相對於該相機焦點的位置,因此可以再將此 相機座標 轉換為 相機的 成像平面座標,成像平面座標 也就是 影像座標。




相機座標 跟 影像座標 的關係

在相機中,假設 P(X, Y, Z) 已經是相機座標,投影在 (虛擬)成像平面座標 (u, v) 上:
Pinhole_Camera_005
根據相似三角形定理,可以得到:
f/Z = u/X = v/Y
 => u = f/Z * X
    v = f/Z * Y

根據 齊次座標 (Homogeneous Coordinates) ,可以表示成:
Pinhole_Camera_006
其中 Pc = (u, v, w) = (fX/Z, fY/Z, 1),但目前 P 非為齊次座標。

如果在影像座標系統中,與 Z 軸所相交的點,並非 原點(0, 0) ,則需要再將 u, v 作適當的位移:
u = fX / Z + tu
v = fY / Z + tv
以齊次座標表示,可以表示為:
Pinhole_Camera_007

在上述的表示中,u, v 的單位為長度單位 (這邊以 "吋 (inch)" 作舉例說明),但是在相機影像中,需要以 pixel 來表示位置,因此,需要知道相機的解析度,進而得知 每吋有幾個像素點 (pixels per inch),通常情況下,u 軸方向與 v 軸方向的單位數量未必會相同,因為 pixel 的形狀有可能並非為正方形。

假設在 u, v 方向軸中,每吋分別有 mu 及 mv 個像素點,因此以像素點來表示 u, v 的算式為:
Pinhole_Camera_008

以矩陣表示為:
Pinhole_Camera_009
其中 αx 為 焦距在 u 軸方向的 pixel 個數,αy 為焦距在 v 軸方向的 pixel 個數,u0, v0 分別是原點在 u, v 軸方向的位移 pixel 個數。

有時 矩陣 K 還會增加一個參數 (skew parameter) - s,這個參數是在影像座標的 u 軸 跟 v 軸沒有垂直的情況下,用來調整像素在成像座標平面中的位置。

如下圖, pixel 的夾角為 α :
calibration_skew

於是通常情況下,K 表示為: (s = αy * tan(α))
Pinhole_Camera_010

可以看到,K 為一個上三角的 3x3 矩陣(Upper Triangular 3x3 Matrix),而與 矩陣 K 有關的參數為:焦距、原點位置、解析度、pixel 的夾角,都是跟相機內部有關的參數,因此此矩陣亦稱為內部參數矩陣 (Intrinsic Parameter Matrix)。

相機座標 跟 影像座標 之間的轉換,就是以內部參數矩陣表示:
Pinhole_Camera_Intrinsic_Matrix




總結:影像座標 vs. 相機座標 vs. 世界座標

綜合上述的結論:
相機座標 = 外部參數矩陣 ([R|t]) x 世界座標。
影像座標 = 內部參數矩陣 (K) x 相機座標。
影像座標 = 內部參數矩陣 (K) x 外部參數矩陣 ([R|t]) x 世界座標:
Pinhole_Camera_Matrix




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




Reference

What Is Camera Calibration?
The Pinhole Camera
Camera calibration With OpenCV

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

拾人牙慧點滴

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


留言列表 (1)

發表留言
  • elmowuming
  • 請教個問題
    成像座標[u v 1]前面的s要怎麼求得?
  • 如果有 世界座標、外部參數矩陣、內部參數矩陣,它們相乘後,即可得到 成像座標[u v 1] 及前面的 s。

    但是如果只知道成像座標及內部參數矩陣,要反推出 s,s 可以說是該成像點與相機的 z 軸距離,也就是深度,這類似於如何成像的二維座標得到現實情況的三維座標,如果只靠單張影像,幾乎是不可能的,可以參考這一篇:3D 深度預測 (3D Depth Estimation) http://silverwind1982.pixnet.net/blog/post/153220298,看是否是你所需要的。

    silverwind1982 於 2017/03/30 14:13 回覆