簡體   English   中英

點對應的基本矩陣

[英]Fundamental Matrix for Point Correspondence

我正在估計基本矩陣,通過使用

cv2.findFundamentalMat()

OpenCV 的方法。 我給出了從 flann matcher 獲得的關鍵點。

# Initiate ORB detector
orb = cv2.ORB_create()
# find the keypoints with ORB
keyPointsLeft = orb.detect(imgLeft,None)
keyPointsRight= orb.detect(imgRight, None)

# compute the descriptors with ORB
keyPointsLeft, descriptorsLeft = orb.compute(imgLeft, keyPointsLeft)
keyPointsRight, descriptorsRight = orb.compute(imgRight, keyPointsRight)
desLeft = np.float32(descriptorsLeft)
desRight = np.float32(descriptorsRight)
matches = flann.knnMatch(desLeft,desRight,k=2)
# Need to draw only good matches, so create a mask
matchesMask = [[0,0] for i in range(len(matches))]

# Apply ratio test
goodMatches = []
ptsLeft = []
ptsRight = []
for i,(m,n) in enumerate(matches):
    if m.distance < 0.7*n.distance:
        x1,y1 = keyPointsLeft[m.queryIdx].pt
        x2,y2 = keyPointsRight[n.trainIdx].pt
        matchesMask[i] = [1,0]
        goodMatches.append([m])
        ptsLeft.append(keyPointsLeft[m.queryIdx].pt)
        ptsRight.append(keyPointsRight[n.trainIdx].pt)

ptsLeft = np.int32(ptsLeft)
ptsRight = np.int32(ptsRight)
F, mask = cv2.findFundamentalMat(ptsLeft,ptsRight,cv2.FM_7POINT)

找到基本矩陣后,我試圖通過對極約束方程驗證點對應關系,即:

(1) p1T * F * p2 = 0

因此,假設我們在左圖像上有點 p1 (x1,y1),在右圖像上有點 p1 (x2,y2)。 因此,如果我將對極方程 (1) 應用於這些點,我應該得到 0,或者更接近於 0 的數字。

所以這個方程可以寫成這樣:

(2) 0 = x1*x2*F[0][0] + x1*y2*F[0][1] + x1*F[0][2] + y1*x2*F[1][0] + y1*y2*F[1][1] + y1*F[1][2] + x2*F[2][0] + y2*F[2][1] +  F[2][2]

通過使用方程(2),我試圖用這個方程驗證 flann 匹配的點。 我打印了等式結果和同一行中的點,因為我的輸入圖像只是在它們之間進行了平移。

輸出 :

p1(82,340) --> p2(74,340)
p1T * F * p2 =  -0.7662387780488729
p1(355,240) --> p2(354,240)
p1T * F * p2 =  -0.0047911844235635215
p1(354,229) --> p2(349,229)
p1T * F * p2 =  0.11662882831689814
p1(377,175) --> p2(372,175)
p1T * F * p2 =  0.3450325352994703
p1(319,227) --> p2(311,227)
p1T * F * p2 =  0.19119563752361657
p1(276,171) --> p2(273,171)
p1T * F * p2 =  0.251353775637849
p1(371,259) --> p2(366,259)
p1T * F * p2 =  -0.019570666111391688
......
....
...

有了這個輸出,我無法驗證點和我的基本矩陣。 等式 (1) 在我的情況下不起作用,有時它給出的值更接近於零,有時則不然。 有什么我做錯了嗎?

我不確定等式 1 是否可以寫成等式 2。我肯定會推薦使用等式 1 和齊次坐標(z 值設置為 1)。 您應該考慮對坐標進行標准化,因為 X 和 Y 將比 Z 大得多。這可以通過計算由 Hartley、Zisserman 建立的相似變換來完成,例如此處所示:第 2 頁

之后,您可以使用 OpenCV Mat直接計算結果。 首先,我建議您嘗試使用不同的方法來計算基本矩陣。 由於您有很多由 ORB 生成的特征點,我將使用CV_FM_RANSAC例如,reprojThreshold 為 3,置信度為 0.99。 這已經可以解決問題了。

C++ 中的簡短代碼示例:

cv::Mat F = cv::findFundamentalMat(kp_left, kp_right, cv::RANSAC, 3.0, 0.999); # here you need to use your feature points cv::Point2f
point_left = cv::Mat(cv::Point3d(82,340,1));
point_right = cv::Mat(cv::Point3d(74,340,1));
cv::Mat distance = point_left.t()*F*point_right;

距離通常永遠不會恰好為 0,但現在應該接近它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM