01. 相機內參和外參的含義?如果將圖像放大兩倍,內外參如何變化?
-
相機有兩個最基礎的數據:內參(Instrinsics)和外參(Extrinsics),內參主要描述的是相機的CCD/CMOS感光片尺寸/分辨率以及光學鏡頭的系數,外參主要描述的是相機在世界坐標系下的擺放位置和朝向角度。
-
參考:https://zhuanlan.zhihu.com/p/646310465
-
相機的內參和外參是用于描述相機如何捕捉三維世界并將其投影到二維圖像平面上的參數。
-
內參(Intrinsic Parameters):
-
內參是相機自身的屬性,與場景無關。它包括焦距(focal length)、主點(principal point,圖像中心的坐標)、畸變系數(distortion coefficients,描述鏡頭畸變如徑向和切向畸變)等。
-
焦距和圖像傳感器的尺寸共同決定了視場角(Field of View, FOV)。
-
主點通常接近圖像中心。
-
內參矩陣一般形式為:
[
K = [ f x 0 c x 0 f y c y 0 0 1 ] K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} K= ?fx?00?0fy?0?cx?cy?1? ?
]
其中 KaTeX parse error: Can't use function '\(' in math mode at position 1: \?(?f_x, f_y) 是焦距在圖像平面上的x軸和y軸的比例,( c x , c y c_x, c_y cx?,cy?) 是主點的坐標。
-
-
外參(Extrinsic Parameters):
-
外參描述的是相機相對于世界坐標系的位置和方向。它由旋轉矩陣(Rotation matrix)和平移向量(Translation vector)組成,這些參數定義了從世界坐標系到相機坐標系的轉換。
-
外參矩陣通常表示為:
KaTeX parse error: Undefined control sequence: \[ at position 2: \?[? \begin{bmatrix…
其中 ( R R R) 是一個3x3的旋轉矩陣,( t t t) 是一個3x1的平移向量。
-
如果將圖像放大兩倍,內外參的變化如下:
-
內參變化:
-
焦距 ( f x , f y f_x, f_y fx?,fy?) 通常不會改變,因為它是基于相機的物理屬性。但是,圖像坐標系的比例變化了,因此主點 KaTeX parse error: Can't use function '\(' in math mode at position 1: \?(?c_x, c_y) 需要調整以反映新的圖像中心。如果原圖中 KaTeX parse error: Can't use function '\(' in math mode at position 1: \?(?c_x, c_y) 是原點,放大后它們將變為原來的兩倍。
-
新的內參矩陣將是:
[
K ′ = [ f x 0 2 c x 0 f y 2 c y 0 0 1 ] K' = \begin{bmatrix} f_x & 0 & 2c_x \\ 0 & f_y & 2c_y \\ 0 & 0 & 1 \end{bmatrix} K′= ?fx?00?0fy?0?2cx?2cy?1? ?
]
-
-
外參變化:
- 外參(旋轉矩陣和平移向量)不會因為圖像尺寸的改變而改變,因為它們描述的是相機與世界坐標系之間的物理關系,與圖像的尺寸無關。
LSS(Lift, Splat, Shoot)
https://github.com/nv-tlabs/lift-splat-shoot
是一個用于三維環境感知和環境表示的視覺感知系統,主要應用于自動駕駛領域。這個方法是一種用于從二維圖像直接構建三維環境表示的深度學習算法。它主要通過以下三個步驟來實現:
-
Lift(提升):
- 這一步涉及到將二維像素“提升”到三維空間中。算法使用從圖像中提取的深度信息將每個像素點映射到一個三維點上。這種映射通常依賴于相機的內參和外參,通過這些參數,可以將二維圖像坐標轉換為三維世界坐標。
-
Splat(噴灑):
- 在“噴灑”步驟中,所提升的三維點被映射到一個離散的三維空間(通常是體素網格)中。這一步是一種數據結構轉換,它把連續的三維點云轉換為離散的體素表示,這種表示更適合用于隨后的處理步驟如卷積神經網絡。
-
Shoot(射擊):
- 最后一步是“射擊”,這里利用三維卷積神經網絡處理提升和噴灑后的數據,從而提取用于任務的特征。例如,自動駕駛車輛可能需要識別和分類不同的道路用戶(如行人、車輛)、道路標記和其他關鍵的環境特征。
LSS方法的一個主要優勢是它能夠直接從圖像數據中構建出三維場景的表示,這有助于自動駕駛系統更好地理解和導航其周圍的環境。此外,它通過利用卷積神經網絡,可以在保持高度準確性的同時實現高效的處理速度。這種方法在自動駕駛技術中具有重要的應用前景,尤其是在需要精確和實時的三維環境感知和決策支持的情況下。
-
02. 坐標系的變換
-
BEV訓練數據集的世界坐標系, 比如nuScenes地圖,它的世界坐標系是圖片坐標系,原點在圖片左下角,單位是米。數據集中會根據時間序列給出車輛的瞬時位置,也就是在這個圖片上的XY。
-
BEV里,這個Ego是特指車輛本身,它是用來描述攝像機/激光雷達(Lidar,light detection and ranging)/毫米波雷達(一般代碼里就簡稱為Radar)/IMU在車身上的安裝位置(單位默認都是米)和朝向角度,坐標原點一般是車身中間,外參(Extrinsics Matrix)主要就是描述這個坐標系的。
-
相機坐標系,坐標原點在CCD/CMOS感光片的中央,單位是像素,內參(Intrinsics Matrix)主要就是描述這個坐標系的。
-
照片坐標系,坐標原點在圖片的左上角,單位是像素,橫縱坐標軸一般不寫成XY,而是uv。
-
照片中的像素位置轉換到世界坐標系時,要經歷:Image_to_Camera, Camera_to_Ego, Ego_to_World;Camera_to_Image通常就是Intrinsics參數矩陣,Ego_to_Camera就是Extrinsics參數矩陣。
03. 放射變換與逆投影變換分別是什么
-
仿射變換: 仿射變換是一種線性變換,保持了直線的平行性和比例關系。它可以用于將一個二維平面上的點映射到另一個二維平面上。仿射變換可以通過一個矩陣乘法和一個平移向量來表示。它包括平移、旋轉、縮放和剪切等操作。在計算機視覺領域,仿射變換常用于圖像的平移、旋轉、縮放和仿射校正等操作。
-
逆投影變換: 逆投影變換是指通過相機內參和外參,將圖像上的點投影到三維空間中的過程。它是相機成像過程的逆過程。逆投影變換可以用于將圖像上的點轉換為三維空間中的點坐標。逆投影變換的計算需要相機的內參矩陣、外參矩陣和圖像上的點坐標。在計算機視覺和計算機圖形學中,逆投影變換常用于三維重建、相機姿態估計和虛擬現實等應用。
import numpy as np
import cv2# 定義相機內參矩陣 K
K = np.array([[1000, 0, 500], [0, 1000, 300], [0, 0, 1]], dtype=np.float32)# 定義相機外參的旋轉矩陣 R(在此為單位矩陣)
R = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=np.float32)# 定義相機外參的平移向量 T
T = np.array([1, 2, 3], dtype=np.float32)# 定義圖像上的點坐標 uv(二維點)
uv = np.array([[200, 300], [400, 500]], dtype=np.float32)# 計算 Rc2w * K 的逆矩陣
Rc2w_invK = np.linalg.inv(np.dot(R, K))# 將 uv 點擴展成齊次坐標,并進行逆投影變換
H = np.dot(Rc2w_invK, np.append(uv, np.ones((uv.shape[0], 1)), axis=1).T)# 計算世界坐標 Pxyz(假設深度為 T[2])
Pxyz = H * (T[2] / H[2]) - T[:2]# 定義仿射變換矩陣 M
M = np.array([[1, 0, 100], [0, 1, 50]], dtype=np.float32)# 加載圖像(假設 image 是事先加載的圖像)
# image = cv2.imread('path_to_your_image.jpg') # 替換為實際圖像路徑# 進行仿射變換
# output = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) # 假設 image 是加載的圖像# 將每一步結果打印出來以進行驗證(可選)
print("相機內參矩陣 K:\n", K)
print("旋轉矩陣 R:\n", R)
print("平移向量 T:\n", T)
print("圖像點坐標 uv:\n", uv)
print("逆 Rc2w * K:\n", Rc2w_invK)
print("齊次坐標 H:\n", H)
print("世界坐標 Pxyz:\n", Pxyz)
print("仿射變換矩陣 M:\n", M)