Pinhole Camera Model 針孔相機模型

Moris
Computer Vision Note
22 min readDec 9, 2022

--

Outline

  1. Pinhole Camera Model的目的與意義
  2. 常用術語
  3. 硬體設置(感光元件與鏡頭)
  4. Camera Model參數(畸變參數、內方位參數與外方位參數)
  5. Pinhole Camera Model計算流程(世界座標系統、相機座標系統與相片座標系統)
  6. Camera Model數學推導
  7. 電腦視覺矩陣 (Matrices in Computer Vision)

1. Pinhole Camera Model的目的與意義

目的上來說,Pinhole Camera Model主要提供了相片中每一像素與像素中物件真實位置的轉換關係,這樣的轉換可以被廣泛應用在各個相關聯的領域,例如「測量」與「建模」、甚至更應用面的詞彙像是「元宇宙」、「虛擬實境」與「自駕車」,從產品面來說,最廣泛應用的大約是intel出的realsense以及stereo lab推出的zed,兩個產品在硬體層面、匹配算法與適用情境上略有差異,但是在算法層面都需要基於這個理論進行研發,所以Pinhole Camera Model也算是一個電腦視覺3D應用中,最基礎也最重要的演算法了。

Pinhole Camera Model (from: https://lhoangan.github.io/assets/images/posts/2018-07-30/camera_model.png)
其中
(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。

內方位參數就是相機本身的既定參數,一旦選好相機(感光元件與鏡頭)後,這些內方位參數也就決定好了,並有以下參數:

  1. f: 焦距(Focal Length),亦即相機中心到感光元件(CCD)之間的距離,在硬體頁面顯示上一般是以mm為單位,但在openCV的設定中是以像素為單位,在後面應用中需注意單位轉換,此外因為感光元件XY軸的像素大小(Pixel Size),也就是每一像素暫實際空間的大小未必相同,因此若f換算為像素單位,XY軸的值也可能不同。
  2. px, py: Pixel Size,width of CCD size / columns, height of CCD size / rows,也就是感光元件上每一像素在實際空間中的大小。
  3. 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代表感光元件到透鏡中心的垂直距離。

從下圖可以得知,透鏡、感光元件與焦距的相對關係。

Relation of focal_length, ccd_size and lens (from: http://www.wescomponents.com/datasheets/dvr/CCD_Focal_Length_Calculator.htm)

需特別提醒的是,因為物件經過透鏡在感光元件上成像時會有上下左右顛倒的現象,為了方便計算,以下會假定感光元件介於透鏡與物件之間,如下圖Image plane位置所示。如此一來,便可以如同本文第一張圖片所示(順序: 透鏡中心=>感光元件=>物件)進行計算了。

4. Camera Model參數

Pinhole Camera Model (from: https://lhoangan.github.io/assets/images/posts/2018-07-30/camera_model.png)

以下簡要說明Pinhole Camera Model所需的已知參數,如上圖所示,距離相機(O點)較遠的紅色P點(下面成為Pw)代表的是世界座標系統的物點,位於相片上的紅色P點(下面成為Pi)則代表Pw點被投影到相片上時,在相片座標系統上的像素座標點。其中,O代表相機中心(實質上是透鏡中心),F代表相片中心,F與O的距離稱為焦距(Focal Length)。

Pinhole Camera Model

上式即是Pinhole Camera Model,可以用來計算3D物點投影到相片上的像素點,要完成這樣的投影轉換主要需取得畸變參數(Distortion Coefficients,沒有出現上面的圖片或式子中)、內方位參數(Intrinsic Parameters)、外方位參數(Extrinsic Parameters)與物點的世界空間座標(World Coordinate),以下逐一介紹:

一、畸變參數

主要用來表示弧面相機鏡頭所導致相片邊緣的像素扭曲的情況,主要有下圖中兩種類型的畸變。上面的圖片或式子中沒有顯示相關的參數,主要是因為他們假設畸變已經被校正,但是這仍然是不能被忽略的步驟,不過簡單的畸變校正可以用OpenCV來完成,本文最後一位提供Python與OpenCV的程式碼,校正算法跟參數結構這裡就不說明了。

Distortion Types

三、相機參數

Pinhole Camera Model

世界空間座標系統與相機座標系統的起始座標位移量(offset)與XYZ軸角度差,一般來說習慣用公式換算出一個3x4的矩陣來表達,也就是上式中的外部參數矩陣,如果是使用OpenCV進行校正,OpenCV會直接提供這個個3x4的矩陣,也就可以直接應用在上式中,但是如果要整合其他硬體資料則需要了解一下,這個矩陣的組成與意義,主要需要了解「位移量」與「角度差」兩個概念,通常做以下表示:

  1. ω, φ, κ or roll, yaw, pitch: 旋轉座標系統,相機xyz軸相對於世界空間座標的旋轉角。可以透過公式轉換為3x3的旋轉矩陣,此參數可以透過。
  2. 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)。在這段轉換的過程中需經過,三個不同的座標系統:

  1. 世界空間座標: 就是下圖中的World Coordinate System,世界空間座標可以是相對的亦可以是絕對的,相對的世界空間座標可以計算物點在某一特定坐標系(另一相機的坐標系、Lidar的坐標系或是IMU的坐標系)的位置與旋轉角;絕對的世界空間座標即是指經緯度座標或是其他二度分帶投影座標(如台灣使用的TWD97座標)。
  2. 相機空間座標: 就是下圖中的Camera Coordinate System,是以mm為單位、以相機的中心點(O點)為原點,以感光元件(藍色畫布)的x軸(綠色x軸)為X軸,以感光元件的y軸(綠色y軸)為Y軸,並以相機中心到感光元件垂直線(OF線段)為Z軸。
  3. 相片平面座標: 就是下圖Imaeg Coordinate System,也就是感光元件所在的位置,因為相片是一個2D平面,僅有X軸與Y軸,其以像素為單位,相片由左到右為X軸、由上到下為Y軸。這裡須注意,這裡的XY軸比較像是OpenCV的設定,OpenCV的第一的維度是橫向的Column、第二個維度是直向的Row,Numpy的第一的維度是直向的Row、第二個維度是橫向的Column。
    整體來說,相片平面座標相機空間座標有三個最重要的差異。

一、維度: 相機空間座標是三個維度的空間座標;相片平面座標是二個維度的平面座標。

二、起始點: 相機空間座標的XY軸原點在相片的正中心;相片平面座標的XY軸原點在相片的左上角。

三、單位: 相機空間座標的單位是mm;相片平面座標的單位是像素。

Pinhole Camera Model (from: https://docs.opencv.org/3.4.15/d9/d0c/group__calib3d.html)

整個Pinhole Camera Mode需經過以下三個流程:

  1. 把P點世界空間座標(Xw, Yw, Zw)轉換成相機空間座標(Xc, Yc, Zc)。
  2. 把物點P(最左上的紅色箭頭P點)投影至透過相似三角形計算的轉換投影至相片上(相片上的紅色箭頭P點),並將單位從mm轉換為像素。
  3. 相機空間座標中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轉換為像素

Pinhole Camera Model (from: https://docs.opencv.org/3.4.15/d9/d0c/group__calib3d.html)

上圖中紫色的線段可以組成兩個三角形,並互為相似三角形。由於上一步驟的計算,已知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 DeviceCCD)兩軸為垂直時,投影的圖像不會有變形的狀況,某些特別的相機成像中,兩軸本身並不一定會是完全方正的,可能存在一些微小的變形,這個時候就需要 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 數學表示法: (沒有位移,只有旋轉)

--

--

Moris
Computer Vision Note

An AI engineer who loves deep learning technology and is willing to share resources and learn new technologies