Photo by João Silas on Unsplash

為什麼需要齊次座標 ( Homogeneous Coordinate)

Flyhead

--

解釋齊次座標系統必要性與 OpenCV 操作

  • 齊次座標易用於進行仿射(線性)幾何變換

笛卡爾幾何空間適合描述2D和3D空間,但無法表達透視空間,比如平行線在笛卡爾幾何空間中是無法相交的,但在透視空間中的無窮遠處是會相交於同一點。齊次座標使用 N+1維來代表N維座標,比如在笛卡爾座標上的點(x, y, x)可以 (x, y, z, 1) 來表達,在無窮遠處的點(x, y, x)可以 (x, y, z, 0)來表達。

圖形應用涉及到幾何變換 (平移、旋轉、縮放), 以矩陣表示式來計算這些變換時,平移是矩陣相加,旋轉和縮放則是矩陣相乘,綜合起來可以表示為p’ = m1*p+ m2。 引入齊次座標的目的主要是合併矩陣運算中的乘法和加法,表示為p’ = p*M的形式。即它提供了用矩陣運算把二維、三維甚至高維空間中的一個點集從一個座標系變換到另一個座標系的有效方法。

(1) 平移矩陣,假設三個平移量分別為Tx、Ty與Tz

(2) 縮放矩陣,假設x、y、z的縮放比例分別為a、b、c

(3) 旋轉矩陣,假設旋轉角度為 Theta

  • 齊次座標能夠用來明確區分向量和點

在齊次座標中,點與向量均可以同一系統表達, 3D向量的第4個代數分量是0,而3D點的第4個代數分量是1。比如(1, 4, 7)如果寫成(1,4,7,0),它就是個向量;如果是(1,4,7,1),它就是個點。

(1) 從普通座標轉換成齊次座標時

如果(x,y,z)是個點,則變為(x,y,z,1);

如果(x,y,z)是個向量,則變為(x,y,z,0)

(2) 從齊次座標轉換成普通座標時

如果是(x,y,z,1),則知道它是個點,變成(x,y,z);

如果是(x,y,z,0),則知道它是個向量,仍然變成(x,y,z)

  • OpenCV 操作
# 建構 2D scale matrix
# 平移矩陣 [[1,0,tx], [0,1,ty],[0,0,1]]
# 縮放矩陣 [[a,0,0], [0,d,0],[0,0,1]]
# x軸旋轉矩陣 [[cos,-sin,0], [sin,cos,0], [0,0,1]]
M_scale = np.array([[fx,0,0],[0,fy,0]],dtype=np.float32)

# cv2.warpAffine(input image, 2x3 transformation matrix, size of the output image)
img_hw = cv2.warpAffine(img_hw, M_scale, (img_hw.shape[1],img_hw.shape[0]) )

--

--