.

iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

延續前一篇的內容,在相機一座標系下的 latexlatex 和在相機二座標系下的 latexlatex 之間的關係是:
latex

左右兩邊都同時乘上 latex,這裡的 latexlatex 的 skew-symmetric matrix:
latex

再將左右兩邊同時乘上 latex,由於 latexlatex 垂直(latex 的特性),所以:
latex

latex 代入:
latex

這個式子就是出名的對極約束 (Epipolar constraint),這個式子包含了相機的內參 latex,外參 latex,以及兩個相機的投影點 latex,全部放到了一個等式當中,我們可以這樣理解這個式子:

  1. 已知相機參數 latex 其況下,給定一個相機上的像素,這個像素在另一個相機上的投影點是有限制的(事實上是一條線上)。
  2. 呼應上一篇的問題,給定兩個圖片中的多個匹配點,我們可以用這個等式推出相機的未知參數。

Fundamental Matrix and Essential Matrix

如果我們把 latex 組合成一個 3x3 矩陣 latex,這個矩陣就是本質矩陣 (Essential Matrix):
latex

把相機內參 latex 也考慮進去,我們可以得到基礎矩陣 (Fundamental Matrix):
latex

對極線 (Epipolar Line)

如果我們已知一個像素在相機二的投影點 latex,而且不知道 latexlatex 的情況下,我們可以用基礎矩陣 latex 和 epipolar constraint latex 得到一個 latex 的線性方程式,也就是說 latex 會在一條線上,這條線就是對極線 (Epipolar Line),如下圖:

epipolar line

練習

先前計算相機姿態的程式碼,裡面就有利用 opencv 的 cv2.findEssentialMat 得到 essential matrix latex,這裡我們可以利用這個 latex 和相機內參得到 fundamental matrix latex,並且給定 latex 就可以畫出在另一張圖上的對極線,程式碼如下:

def plot_epipolar_line(image1, image2, point1, point2, E, K):
    # Make point1 homogenous
    point1 = np.array(point1.tolist() + [1])

    # Compute fundamental matrix
    F = np.linalg.inv(K).T @ E @ np.linalg.inv(K)
    line = F @ point1.T
    line /= np.linalg.norm(line[:2])
    line = line.ravel()
    x = np.array([0, image1.shape[1]])
    y = (-line[2] - line[0] * x) / line[1]

    # Plot the result
    plt.figure()
    plt.subplot(121)
    plt.axis("off")
    plt.imshow(cv2.cvtColor(image1, cv2.COLOR_BGR2RGB))
    plt.plot(point1[0], point1[1], "ro")
    plt.subplot(122)
    plt.axis("off")
    plt.imshow(cv2.cvtColor(image2, cv2.COLOR_BGR2RGB))
    plt.plot(point2[0], point2[1], "ro")
    plt.plot(x, y, c="b")
    plt.show()


plot_epipolar_line(rgb1, rgb2, points1[0], points2[0], E, intrinsic)

結果如圖,可以看到對應點 latex 就在對極線上:

epipolar line


上一篇
Day15: 對極幾何 Epipolar geometry (一)
下一篇
Day17: 對極幾何 Epipolar geometry (三)
系列文
3D 重建實戰:使用 2D 圖片做相機姿態估計與三維空間重建30
.
圖片
  直播研討會

尚未有邦友留言

立即登入留言