Pinhole Camera Model 針孔相機模型
Outline
- Pinhole Camera Model的目的與意義
- 常用術語
- 硬體設置(感光元件與鏡頭)
- Camera Model參數(畸變參數、內方位參數與外方位參數)
- Pinhole Camera Model計算流程(世界座標系統、相機座標系統與相片座標系統)
- Camera Model數學推導
- 電腦視覺矩陣 (Matrices in Computer Vision)
1. Pinhole Camera Model的目的與意義
目的上來說,Pinhole Camera Model主要提供了相片中每一像素與像素中物件真實位置的轉換關係,這樣的轉換可以被廣泛應用在各個相關聯的領域,例如「測量」與「建模」、甚至更應用面的詞彙像是「元宇宙」、「虛擬實境」與「自駕車」,從產品面來說,最廣泛應用的大約是intel出的realsense以及stereo lab推出的zed,兩個產品在硬體層面、匹配算法與適用情境上略有差異,但是在算法層面都需要基於這個理論進行研發,所以Pinhole Camera Model也算是一個電腦視覺3D應用中,最基礎也最重要的演算法了。
其中
(Xw,Yw,Zw): 世界座標,即一絕對座標系
(Xc,Yc,Zc): 相機座標,以相機為中心的相對坐標系
(cx,cy): 主點 Principle Point為投射在螢幕上的座標s: 投射平面若兩軸非垂直的調整參數 => In 數學表達式
[R|T]: 將世界座標轉換為相機座標之轉換矩陣,其實就是一個旋轉平移的線性變換
O(Fc): 相機座標系統中的原點p: 由相機座標Xc,Yc,Zc轉換的2D投影空間(像平面)
(u,v): 投射平面上的座標 ( 單位為像素 )
su,sv: 用來計算每個真實世界單位的像素點(通常為英寸,因此命名為每英寸點數(DPI)或每英寸像素數(PPI))
f: 焦距(focal length)
如上圖所示,Pinhole Camera Model主要解釋了2D相片座標系統與3D世界座標系統的轉換關係,2D與3D的轉換上可以分為兩個方向的轉換(2D=>3D及3D=>2D)。由於3D空間的點(XYZ)富含的資訊量比較2D(XY)相片大,若要把2D相片上的點投影至3D空間中,需要兩張以上不一樣角度拍攝的相片,才能把2D相片中的點投影至3D空間中,並定位其在3D空間中的位置。若要從3D空間中的點投影至2D相片上,由於是一個降低維度的運作,一張相片即可完成。因此,為了方便理解,Pinhole Camera Model一般是將已知的3D空間座標點投影到相片上,並計算其在相片上的像素位置。
2. 常用術語
- 內參矩陣: Intrinsic Matrix
- 外部參數矩陣: Extrinsic Matrix
- 焦距: Focal Length
- 主點: Principal Point
- 徑向畸變: Radial Distortion
- 切向畸變: Tangential Distortion
- 旋轉矩陣: Rotation Matrices
- 平移向量: Translation Vectors
- 平均重投影誤差: Mean Reprojection Error
- 重投影誤差: Reprojection Errors
- 重投影點: Reprojected Points
- 齊次座標: Homogeneous Coordinates
3. 硬體設置(感光元件與鏡頭)
隨著時代的進步,感光元件與鏡頭的種類也越來越多元,並不是所有相機都可以直接透過Pinhole Camera Model進行解構,例如魚眼鏡頭,其觀測的角度很多時候已經超過180度,可以想像成人的眼睛可以看到後腦杓的物件,Pinhole Camera Model卻只能處理180度以內的投影,因此並無法直接適用於這類相機,這時可能就必須尋找其他Camera Model來解決問題,如Fisheye Camera Model。也有一些類型的相機是需要經過特殊校正方法處理後才能套用Pinhole Camera Model,例如rolling shuttle的相機,因為這種相機是一行(row)一行進行取像地,若是在行進中取像,可能會導致同一張影像中的每行(row)會有平移的現象,這種就需要透過特殊的校正方式處理後,方能使用Pinhole Camera Model。
內方位參數就是相機本身的既定參數,一旦選好相機(感光元件與鏡頭)後,這些內方位參數也就決定好了,並有以下參數:
- f: 焦距(Focal Length),亦即相機中心到感光元件(CCD)之間的距離,在硬體頁面顯示上一般是以mm為單位,但在openCV的設定中是以像素為單位,在後面應用中需注意單位轉換,此外因為感光元件XY軸的像素大小(Pixel Size),也就是每一像素暫實際空間的大小未必相同,因此若f換算為像素單位,XY軸的值也可能不同。
- px, py: Pixel Size,width of CCD size / columns, height of CCD size / rows,也就是感光元件上每一像素在實際空間中的大小。
- n_rows, n_col: 相片的像素解析度 e.g. 1920 x 1080的相片n_rows是1080且n_cols是1920。
需別提醒的是,要拿來做測量的相機務必是定焦相機,焦距的變動亦會影響到其他參數如畸變參數與內方位參數,如此便無法進行量測。因此,在開始相關專案時必須確保使用的相機是定焦的鏡頭,並可以查得相機所使用的感光元件大小與像素大小。以Lucid工業相機為例,這邊隨機挑選了一台五百萬畫素的相機與4mm焦距的鏡頭。相機的規格如下圖,Sensor Size代表的是整個感光元件的大小,有些地方會用CCD Size表示,11.1mm代表的是感光元件對角線的長度。Pixel Size代表每一個像素的實際大小。一般來說,Sensor Size的長與寬除以像素的數量約會等於Pixel Size。
鏡頭的規格如下,Focal Length代表感光元件到透鏡中心的垂直距離。
從下圖可以得知,透鏡、感光元件與焦距的相對關係。
需特別提醒的是,因為物件經過透鏡在感光元件上成像時會有上下左右顛倒的現象,為了方便計算,以下會假定感光元件介於透鏡與物件之間,如下圖Image plane位置所示。如此一來,便可以如同本文第一張圖片所示(順序: 透鏡中心=>感光元件=>物件)進行計算了。
4. Camera Model參數
以下簡要說明Pinhole Camera Model所需的已知參數,如上圖所示,距離相機(O點)較遠的紅色P點(下面成為Pw)代表的是世界座標系統的物點,位於相片上的紅色P點(下面成為Pi)則代表Pw點被投影到相片上時,在相片座標系統上的像素座標點。其中,O代表相機中心(實質上是透鏡中心),F代表相片中心,F與O的距離稱為焦距(Focal Length)。
上式即是Pinhole Camera Model,可以用來計算3D物點投影到相片上的像素點,要完成這樣的投影轉換主要需取得畸變參數(Distortion Coefficients,沒有出現上面的圖片或式子中)、內方位參數(Intrinsic Parameters)、外方位參數(Extrinsic Parameters)與物點的世界空間座標(World Coordinate),以下逐一介紹:
一、畸變參數
主要用來表示弧面相機鏡頭所導致相片邊緣的像素扭曲的情況,主要有下圖中兩種類型的畸變。上面的圖片或式子中沒有顯示相關的參數,主要是因為他們假設畸變已經被校正,但是這仍然是不能被忽略的步驟,不過簡單的畸變校正可以用OpenCV來完成,本文最後一位提供Python與OpenCV的程式碼,校正算法跟參數結構這裡就不說明了。
三、相機參數
世界空間座標系統與相機座標系統的起始座標位移量(offset)與XYZ軸角度差,一般來說習慣用公式換算出一個3x4的矩陣來表達,也就是上式中的外部參數矩陣,如果是使用OpenCV進行校正,OpenCV會直接提供這個個3x4的矩陣,也就可以直接應用在上式中,但是如果要整合其他硬體資料則需要了解一下,這個矩陣的組成與意義,主要需要了解「位移量」與「角度差」兩個概念,通常做以下表示:
- ω, φ, κ or roll, yaw, pitch: 旋轉座標系統,相機xyz軸相對於世界空間座標的旋轉角。可以透過公式轉換為3x3的旋轉矩陣,此參數可以透過。
- t1, t2, t3: Translation。在相機座標系統中,相機中心所在位置與世界座標系統的原點的位移(Offset)。
在旋轉角度差的表達上,主流有兩種不同的座標轉換系統,omega, phi, kappa系統以及roll, yaw, pitch系統,兩種系統只是表示方式的不同並可以互相轉換,已經有很多文章介紹兩者的定義與差異,這邊就不贅述了。
比較重要的是需要知道如何透過XYZ軸角度差,計算出轉換兩座標系統(世界and相機)的旋轉矩陣以方便Pinhole Camera Model的應用。以omega, phi, kappa系統為例,下面是將其轉換為旋轉矩陣的公式,其中omega, phi, kappa分別是XYZ軸的角度差,經過下面公式轉換後可以得到相應的旋轉矩陣,有線性代數座標系統轉換的基礎便很好理解其中意義,不過在這邊沒有相關基礎亦可以直接操作。
另外一個疑惑會是,如何取得omega, phi, kappa參數。實務上來說,若要真正得知跟相機跟世界座標系統的轉換非常困難,就算使用校正方法計算出來,相機一旦移動便要重新校正,若要在移動仍要維持轉換矩陣可以運作,就必續配備非常高規格的GPS與IMU(慣性導航儀),或是透過其他軟體方法計算不同時間點相片的位移量(e.g. SLAM),但這些設備或算法的取得、設定與使用都很仰賴知識與經驗,建議小心入坑。
實際應用中,如果並不在意物件在世界座標系統中的位置,只需要取得同一物件的3D資訊,那麼透過兩台相機相對位置的校正便可達成目的,因此,旋轉矩陣在Pinhole Camera Model中雖然是世界空間座標系統與相機座標系統的轉換矩陣,但在實務應用上,常常應用在兩感測器(e.g. 兩台相機)座標系統的轉換。以兩台相機為例,旋轉矩陣便可以透過OpenCV與校正板事先校正得知,後面會提供程式碼。
四、物點在世界空間座標的位置
在使用情境下,物點一般是需要透過測量而得知的座標點,僅有在校正畸變參數、內方位參數或外方位參數時,可以事先取得校正板上面已經定義好的座標點位置。不過如果前面目的段落的敘述,為了讓我們快速了解Pinhole Camera Model,先從3D物點投影至2D相片所需要的資訊量較少,硬體設置也較簡單,就先假設3D物點在世界空間座標的位置是已知的。
四、總結
- 內部參數矩陣:處理相機座標系到影像座標系的投影
- 外部參數矩陣:處理世界座標系到相機座標系的座標轉換
5. Pinhole Camera Model計算流程
接下來要介紹本篇文章的主題Pinhole Camera Model本身。上面已經說明,Pinhole Camera Model一般是將已知的3D空間座標點投影到相片上,並計算其在相片上的像素位置。明確來說,就是在已知上面參數的情況下,計算物點P(Xw, Yw, Zw)投影在相片上的像素點索引值(u, v)。在這段轉換的過程中需經過,三個不同的座標系統:
- 世界空間座標: 就是下圖中的World Coordinate System,世界空間座標可以是相對的亦可以是絕對的,相對的世界空間座標可以計算物點在某一特定坐標系(另一相機的坐標系、Lidar的坐標系或是IMU的坐標系)的位置與旋轉角;絕對的世界空間座標即是指經緯度座標或是其他二度分帶投影座標(如台灣使用的TWD97座標)。
- 相機空間座標: 就是下圖中的Camera Coordinate System,是以mm為單位、以相機的中心點(O點)為原點,以感光元件(藍色畫布)的x軸(綠色x軸)為X軸,以感光元件的y軸(綠色y軸)為Y軸,並以相機中心到感光元件垂直線(OF線段)為Z軸。
- 相片平面座標: 就是下圖Imaeg Coordinate System,也就是感光元件所在的位置,因為相片是一個2D平面,僅有X軸與Y軸,其以像素為單位,相片由左到右為X軸、由上到下為Y軸。這裡須注意,這裡的XY軸比較像是OpenCV的設定,OpenCV的第一的維度是橫向的Column、第二個維度是直向的Row,Numpy的第一的維度是直向的Row、第二個維度是橫向的Column。
整體來說,相片平面座標與相機空間座標有三個最重要的差異。
一、維度: 相機空間座標是三個維度的空間座標;相片平面座標是二個維度的平面座標。
二、起始點: 相機空間座標的XY軸原點在相片的正中心;相片平面座標的XY軸原點在相片的左上角。
三、單位: 相機空間座標的單位是mm;相片平面座標的單位是像素。
整個Pinhole Camera Mode需經過以下三個流程:
- 把P點世界空間座標(Xw, Yw, Zw)轉換成相機空間座標(Xc, Yc, Zc)。
- 把物點P(最左上的紅色箭頭P點)投影至透過相似三角形計算的轉換投影至相片上(相片上的紅色箭頭P點),並將單位從mm轉換為像素。
- 把相機空間座標中P點的座標(uc, vc, f)轉換為相片座標(u, v)
一、把P點世界空間座標(Xw, Yw, Zw)轉換成相片空間座標(Xc, Yc, Zc)
從上式來看,紅色框框內的計算就是將世界空間座標(Xw, Yw, Zw)轉換成相機空間座標(Xc, Yc, Zc),詳細的來說,又分為旋轉角的轉換(R)與位移(T),R是一個3x3的矩陣,實際意義則記錄了XYZ軸旋轉的角度,T的部分則是在相機空見座標系統中,相機空間座標中心與世界空間座標中心的位移量,所以將物點透過R轉換到相機空間後,再加上T位移,便可得到誤點在相機座標系統的位置,也就是下式中的(Xc, Yc, Zc)。
還是在強調一次,這部份如果無法理解,可以去研究線性代數的Change of Basis,不過如果沒有相關基礎,這部分會需要一段時間去理解,此處可以先以應用為主。
二、把物點P(最左上的紅色箭頭P點)投影至透過相似三角形計算的轉換投影至相片上(相片上的紅色箭頭P點),並將單位從mm轉換為像素
上圖中紫色的線段可以組成兩個三角形,並互為相似三角形。由於上一步驟的計算,已知P點在相機空間座標為(Xc, Yc, Zc),透過相似三角形的計算可以得知其在相機空間座標中P點投影至相片上的位置(uc, vc, f),此處的Z軸必定是焦距(focal length,上圖中的F),因為是在相機空間座標中,所以uc與vc中的c是Camera的縮寫。
我們把相似三角形投影在XZ平面上的相似三角形解剖來看可以得到下圖,P點在相機空間座標中X軸座標為Xc、Y軸座標為Yc,其投影在相片上的Z軸座標為f,那麼X軸座標就會等於(fx/Zc)*Xc。如果套用在YZ平面上面即可以得到,Y軸座標等於(fy/Zc)*Yc。下面最右下式將其改寫為矩陣相乘的形式,不過得到的結果會是一致的。
這邊須注意,在openCV的設定中,fx, fy的單位是像素,所以uc跟vc的單位已經被轉換為像素(而不是mm)。
三、把相機空間座標中P點的座標(uc, vc, f)轉換為相片座標(u, v)
前面有提到,相片平面座標與相機空間座標有三個最重要的差異: 維度、起始點與單位。維度部份把Z軸的值拿掉即可,單位部分在上一步驟已經轉換完成,因此在這個階段,只需要把起始點從相片的正中心移動到相片的左上角,也就是加上相片正中心的像素值(cx, cy)即可完成。舉例而言,假設相片長寬是128*128,uc, vc = (0, 0),那麼u, v = (64, 64)。
最後我們再回過頭來看原式,等號的左手邊u, v旁邊還乘一個s,等號右手邊乘開來X軸會等於fx*Xc+0+cx*Zc、Y軸會等於0+fy*Yc+cy*Zc、Z軸會等於Zc,但左手邊我們需取得的Z軸是1,所以將XYZ軸全部除以Zc,也就是將s社等維Zc便可成功建立等號。
6. Camera Model數學推導
Step 1.假設物體的世界座標為 (Xw,Yw,Zw),那必須先做一個線性變換,轉換成以相機為主的相機座標。
Step 2.接下來要計算物件投影到平面的座標,根據三角關係可以改寫成以右邊形式
但在圖像的座標中,圓點往往不是中心點,而是圖像的左下角,因此,以圖像中心為原點的(uc,vc) 座標還需要做修正
Step 3. 接下來要做單位的轉換,目前 (u,v) 是以長度為單位 (cm, inch,…),然而在圖像上通常是以像素 (pixel) 為計算單位,所以必須要再做一個單位上的轉換。
每一個像素長寬比並非都是 1:1 因此在長與寬上,每長度單位上的像素數量也可能會不同,因此我們引進 k, l兩個參數進來,其單位為 (pixel/cm),意義即為長與寬中每長度單位的像素數量。
Step 4. 以線性變換的矩陣描述
在電腦視覺領域中,最常用的方式就是將其以非線性變換的齊次座標系(Homogeneous coordinate system)來重新表述
Step 5. 此外,以上都是假設當相機電荷耦合器件(Charge-coupled Device,CCD)兩軸為垂直時,投影的圖像不會有變形的狀況,某些特別的相機成像中,兩軸本身並不一定會是完全方正的,可能存在一些微小的變形,這個時候就需要 s (skew parameter) 這個參數來做調整
這個 K 矩陣完全由相機本身的參數所構成,我們會稱這樣的矩陣為「內部參數矩陣」(Intrinsic Parameter Matrix),總結以上便可以推得,而q為影像座標向量,W是世界座標向量
綜合上述的結論:
相機座標(Q) = 外部參數矩陣([R|t]) x 世界座標(W)。
外部參數矩陣,就是由世界座標轉換成相機座標所需要的位移(T)及旋轉(R)所組成影像座標(q) = 內部參數矩陣(K) x 相機座標(Q)。 => q=kQ
影像座標(q) = 內部參數矩陣(K) x 外部參數矩陣([R|t]) x 世界座標(W)外部參數矩陣([R|t]):負責Affine Transform
內部參數矩陣(K):負責Perspective(Projective) TransformK 為一個上三角的 3x3 矩陣(Upper Triangular 3x3 Matrix),而與 矩陣 K 有關的參數為:焦距、原點位置、解析度、pixel 的夾角,都是跟相機內部有關的參數,因此此矩陣亦稱為內部參數矩陣 (Intrinsic Parameter Matrix)
7. 電腦視覺矩陣 (Matrices in Computer Vision)
Camera Matrix
Camera Matrix 是一個 3x4 的矩陣,用來表示在針孔相機 (Pinhole Camera) 的成像過程中,物體的 3維座標點,會成像在 相機 2維成像平面上的哪個位置,相關細節可以參考:Pinhole Camera 的數學成像原理。
也就是說,只要有了 Camera Matrix,搭配某物體的 3維座標點,就可以得知該物體會在成像平面的哪個位置成像。
又或是有了 Camera Matrix,就可以將 2維成像平面上的物體,回推出其 3維座標,但整體的 (X, Y, Z) 比例無法確定,因為有個 scalar factor 無法得知。
圖形表示法:
數學表示法:
Fundamental Matrix
Fundamental Matrix 是一個 3x3 的矩陣,試著想像在空間中,有一個物體,由兩臺不同位置的相機所拍攝,各自在自己相機的成像座標平面上成像,而 Fundamental Matrix 就是來表示這兩個成像座標之間的關係,相關細節可以參考:Epipolar Geometry。
圖形表示法:
數學表示法:
Essential Matrix
Essential Matrix 是一個 3x3 的矩陣,類似 Fundamental Matrix,只是這兩個座標的關系,在將物體的世界座標經由外部參數矩陣,轉換成相機座標時,就已經存在。
試著想像在空間中,有一個物體,由兩臺不同位置的相機所拍攝,各自轉換成相對於自己相機的相機座標,而 Essential Matrix 就是來表示這兩個成像座標之間的關係,相關細節可以參考:Epipolar Geometry。
圖形表示法:(同 Fundamental Matrix)
數學表示法:
Homography Matrix
Homography Matrix 是一個 3x3 的矩陣,類似 Essential Matrix,只是兩台相機的相對位置,沒有位移,只有旋轉,或者是這兩台相機所拍攝的是一個平面影像 (planar scene)。
可以說 Homography Matrix 的存在,是為了補足 Epipolar Geometry 的缺陷而存在,因為 Epipolar Geometry 在兩台相機的相對位置只有旋轉的變化時,不成立。
至於在平面影像中,為何 Epipolar Geometry 不成立,目前瞭解不夠深,所以尚未有解答…
Planar Homography 圖形表示法:
Planar Homography 數學表示法:
Infinite Homography 數學表示法: (沒有位移,只有旋轉)