真實世界的物體,在 Pinhole Camera Model 下,其座標變化情況為:
三維的世界座標須先轉換為相對於相機的相機座標,接著將相機座標再轉換為相機成像平面上的影像座標,這之間的座標轉換過程,就與它的成像原理相關。




Pinhole Camera 的成像

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

Pinhole_Camera_001

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




何謂世界座標?

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

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

理論上這三種方式是都可以的,只要有個一致的座標,供任何對此影像拍照的 Camera 使用即可;在實際上,通常以主相機為主,以減少所需要的計算量,這樣以主相機算出來的座標點,不用再經過轉換,直接就可拿來用;主相機可以是右側的相機,也可以是左側的相機。
這個座標的專有名稱就叫做世界座標。

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




為什麼需要世界座標?

會需要世界座標的原因在於為了讓對同一點 A ,經由不同角度的相機所拍攝,相機彼此之間有一個共通的座標計算方式,接著才能藉由經不同角度所拍攝出來的影像中,回推出 A 點在世界座標的位置。




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

先設定 A 點的世界座標為 (X, Y, Z),接著在世界座標經過特定的 "平移" 及 "旋轉" 之後,可以轉換成相機座標。
這邊的基本觀念為:任意不同位置、不同方向的兩個外觀相同的物體,任一物體經過特定的平移及旋轉後,即可跟另一個物體具有相同的位置、方向;把這個觀念延伸,可以理解為把世界座標經過特定的平移跟旋轉後,可以轉換成相機座標。


如上圖所示,令平移為 T(Tx, Ty, Tz),旋轉為 R 是一個 3x3 的旋轉矩陣,另外,因為是經過平移後,才作旋轉,所以所平移的 T 需要再乘上旋轉矩陣。
R 為 3x3 矩陣,T 為 3x1 矩陣,RT 還是 3x1 矩陣,而 [R | RT] 合併起來,就是一個 3x4 矩陣,這個 3x4 矩陣的專有名詞為外部參數矩陣 (Extrinsic Parameter Matrix)。
將世界座標轉換成相機座標所需要的位移及旋轉,即是外部參數:

R: r11 ~ r33; RT: t1 ~ t3

世界座標經過轉換成像機座標後,表示所得到的座標,是相對於該特定相機本身的位置而言,於是可以根據轉換過後的座標來進行與該相機的成像平面之間的座標轉換。




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

在相機中,假設 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 個數。

可以看到,與 矩陣 K 有關的參數為:焦距、原點位置、解析度,都是跟相機內部有關的參數,有時 K 還會增加一個參數 (skew parameter) - s,這個參數是在影像座標的 u 軸 跟 v 軸沒有垂直的情況下,用來調整像素在成像座標平面中的位置。

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

於是通常情況下,K 表示為: (s = αy * tan(α))
Pinhole_Camera_010
K 為一個上三角的 3x3 矩陣(Upper Triangular 3x3 Matrix),此矩陣亦稱為內部參數矩陣 (Intrinsic Parameter Matrix),相機座標 跟 影像座標 的關係,就是以此矩陣表示。

Pinhole_Camera_Intrinsic_Matrix




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

綜合上述的結論:
相機座標 = 外部參數矩陣 ([R|t]) x 世界座標。
影像座標 = 內部參數矩陣 (K) 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 發表在 痞客邦 PIXNET 留言(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 回覆

找更多相關文章與討論