相機參數 包括 內部參數(intrinsic parameters)、外部參數(extrinsic parameters) 以及 失真系數(Distortion Coefficients),而 Camera Calibration 最主要的目的是為了求得相機的 內部參數 及 Distortion Coefficients。

相機內部參數有關的參數為:相機焦距在成像平面 x, y 軸方向的距離(以像素為單位),相機焦距與成像平面的 z 軸相交點的位置,成像平面上 x, y 軸的夾角。

相機外部參數由相機相對於世界座標原點的移動及旋轉組成,或者是相機不動,由物體相對於世界座標原點的移動及旋轉組成。

失真系數 則跟相機鏡頭的透鏡有關,相關情況為:光線經過透鏡時的所產生的彎曲情況及透鏡與成像平面是否為平行。

接下來,分成三個主題作介紹,分別為:相機的內部及外部參數、相機的失真係數、OpenCV 的校正實例。




內部參數矩陣、外部參數矩陣

Camera Calibration 是利用多個已知的 世界座標 跟 其對映的 影像座標 的點,來求該 Camera 的 內部參數矩陣 及 外部參數矩陣,其理論基礎為:

也就是 世界座標(3D) 經過 相機外部參數矩陣的作用 轉換成 相機座標(3D),而相機座標(3D) 再經過相機內部參數矩陣的投影作用轉換成 影像座標(2D)。

根據針孔相機成像成理,假設 Q 點的世界座標為 (X, Y, Z),而影像座標的座標為 (u, v),可以得到以下相機矩陣關係:
Pinhole_Camera_Matrix
假設 內部參數矩陣 乘 外部參數矩陣 為 C = K [R | t] = [KR | KRT] = [M | MT],可以得知 C 為 3x4 矩陣,共有 12 個未知數。

以 M = KR 來看,因為 K 為上三角矩陣 (Upper Triangular Matrix),且 R 為 Orthogonal Matrix,因此只要求得 C,即可以得知 M 及 MT,接著再對 M 作 QR 分解,即可分別求得 K(內部參數矩陣) 及 R(外部參數矩陣)。
(若 QTQ = I 成立,則 Q 為 Orthogonal Matrix,又因為上式中, R 為旋轉矩陣,所以 RTR = I 一定成立。)

假設空間中有一點 P1,其世界座標為 (X1, Y1, Z1),則其與矩陣 C 之間,具有下列成像關係:

但實際上,在成像平面的座標點為:(u1/w1, v1/w1) = (u'1, v'1)。

令 C = (r1, r2, r3)T,再加上 P1 與 Pc1的關聯性,可以得到:


如此可以得到以下兩個方程式:

在這兩個方程式中,只有 r1, r2, r3 為未知,也就是 12 個變數未知。

所以每個世界座標的 3D 點 對映到 影像座標的組合,都可以產生兩個方程式,而方程式中,共有 12 個未知數,所以最佳情況下,只要有 12 個方程式,也就是 6 組世界座標的 3D 點 對映到 影像座標的組合,即可求得 C 矩陣的完整解。

又因為 C = K [R | t] = [KR | KRT] = [M | MT],所以在 C 得知後,M, MT 為 C 的一部分,不需計算即可得知。
有了 M 及 MT 的值,為了要求 T ,需要先求 M-1,再將 M-1 * MT,即可得到 T。
最後對 M 作 QR 分解,求得 K 及 R,分解完畢後,所有的值都求出來了, K 即為相機的內部參數矩陣, R 及 T 即為相機的外部參數矩陣。




Distortion Coefficients

在相機的成像矩陣當中,並沒有包含 lens distortion,這是因為一個理想的 Pinhole Camera 是不需要 透鏡(lens) 的;但在實際的相機中,Camera model 則包含了 radial lens distortion 以及 tangential lens distortion。

Radial Distortion

Radial Distortion 發生的原因在於當光線經過透鏡的邊緣時,其彎曲的程度比在透鏡的中心為大,distortion 的情況在透鏡愈小時,會愈明顯。

Radial Distortion 的形變有兩種:Pincushion 及 Barrel
radial_distortion

Radial Distortion Coefficients 為 Radial Distortion 對相機座標影像的影響強度:
xdistorted = x(1 + k1*r2 + k2*r4 + k3*r6)
ydistorted = y(1 + k1*r2 + k2*r4 + k3*r6)

x, y:經過相機外部參數矩陣處理後,所得到的相機座標影像
(xdistorted, ydistorted):經過 distortion 後的影像座標
k1, k2, k3:Radial Distortion Coefficients
r2:x2 + y2

一般來說,求 k1, k2 已經可以滿足大部分作 calibration 的需求,除非 distortion 的情況很嚴重,才需要求到 k3

Tangential Distortion

Tangential Distortion 發生的情況為相機的成像平面與針孔之間,並不是平行:
Tangential_Distortion

造成物體在成像平面上,會有扭曲的情況:
Tangential_Distortion

Tangential Distortion Coefficients 為 Tangential Distortion 對相機座標影像的影響強度:
xdistorted = x + [2 * p1 * x * y + p2 * (r2 + 2 * x2)]
ydistorted = y + [p1 * (r2 + 2 * y2) + 2 * p2 * x * y]

x, y:經過相機外部參數矩陣處理後,所得到的相機座標影像
(xdistorted, ydistorted):經過 distortion 後的影像座標
p1, p2:Tangential Distortion Coefficients
r2:x2 + y2

Distortion Coefficients 共有 5 個,包含:k1, k2, k3, p1, p2




Calibration With OpenCV

最後探討實例,來瞭解 Camera Calibration 在 OpenCV 上是如何實作的,以下為 OpenCV 官方網頁的介紹。

一開始就有提過的 Pinhole Camera Model,其世界座標點經過透視轉換後,得到影像座標的矩陣表示法:
pinhole_model
也就是:
pinhole_model_matrix

為了方便計算,假設 skew coefficient 為 0
(X, Y, Z) 為 3D 點的世界座標
(u, v) 為影像座標
A 為相機矩陣,也就是內部參數矩陣
(cx, cy) 為影像的正中心點座標
fx, fy 為以 pixel 為單位的焦距距離

這些參數中,在相機焦矩固定的情況下,相機內部矩陣並不會因為相機的移動或拍攝場景的不同就改變。
但 [R|t] - 相機外部矩陣就不同,在拍攝物體固定的情況,它是用來描述相機的旋轉及位移;或是相反的,在相機固定的情況下,用來描述拍攝物體的旋轉及位移。

相機外部矩陣用來將物體的三維世界座標轉換成相對於相機的三維相機座標,而三維相機座標再經過相機內部矩陣轉換為影像座標,其轉換可以下圖表示 (在 z 不為 0 的情況下):
world_to_camera

不過在現實上,透鏡會有 distortion,一般為 radial distortion 及 tangential distortion,所以 model 需要修改為:
world_to_camera_distortion

k1, k2, k3, k4, k5, k6 為 radial distortion coefficients
p1, p2 為 tangential distortion coefficients
在 OpenCV 所提供的 function - calibrateCamera() 中,distortion coefficients 的排列方式為:
(k1, k2, p1, p2[, k3[, k4, k5, k6]])

distortion coefficients 同樣也不會因為拍攝場景不同而改變,所以也屬於相機內部參數。
不同的是,即使影像解析度由 320 x 240 修改為 640 x 480,distortion coefficients 也維持一樣的參數,但 fx, fy, cx, cy 則需要作適當的修改。


CalibrateCamera()
OpenCV 所提供的函式,在提供足夠數量的 calibration pattern 的情況下,可以用來求得 相機內部及外部參數。

cv_calibratecamera

objectPoints: 所拍攝物體的 3D 世界座標點
imagePoints: 所拍攝物體在影像中 2D 影像座標點
imageSize: 所拍攝影像的長、寬
cameraMatrix: 相機內部參數矩陣
distCoeffs: distortion coefficients, (k1, k2, p1, p2[, k3[, k4, k5, k6]])
rvecs: 所預估的旋轉矩陣 (rotation)
tvecs: 所預估的位移矩陣 (translation)
flags: 設定 flag,不同的 flag 有不同的函意
criteria: 停止遞迴演算法的條件

Camera calibration With OpenCV的範例中:
objectPoints 所帶的值為 chessboard 的實體座標點座標,frame 的個數與 imagePoints 的影像個數相同
imagePoints 為所拍攝的每張影像裡的每個影像座標

如此搭配每張 frame 的 3D 世界座標及影像座標,就可以算出內部參數矩陣、distortion coefficients 以及每張 frame 的外部參數矩陣,外部參數矩陣也就是 rotation 及 translation。




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




Reference

What Is Camera Calibration?
The Pinhole Camera
Camera calibration With OpenCV
Camera Calibration and 3D Reconstruction

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

拾人牙慧點滴

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