如何在OpenCV Python中實現基於FLANN的特徵匹配?


我們使用尺度不變特徵變換 (SIFT) 和FLANN (快速近似最近鄰庫) 來實現兩幅影像之間的特徵匹配。SIFT 用於查詢特徵關鍵點和描述符。基於FLANN 的knn匹配器用於匹配兩幅影像中的描述符。我們使用cv2.FlannBasedMatcher() 作為基於FLANN 的匹配器。

步驟

要使用SIFT特徵檢測器和基於FLANN的匹配器實現兩幅影像之間的特徵匹配,您可以按照以下步驟操作:

  • 匯入所需的庫OpenCV、MatplotlibNumPy。確保您已安裝它們。

  • 使用cv2.imread()方法讀取兩幅輸入影像為灰度影像。指定影像的完整路徑。

  • 使用sift=cv2.SIFT_create()初始化具有預設值的SIFT物件。

  • 使用sift.detectAndCompute()檢測並計算兩幅輸入影像中的關鍵點'kp1'和'kp2'以及描述符'des1'和'des2'。

  • 建立一個基於FLANN的匹配器物件flann = cv2.FlannBasedMatcher(),並使用flann.knnMatch(des1,des2,k=2)匹配描述符。它返回匹配項。對匹配項應用比率測試以獲得最佳匹配項。使用cv2.drawMatchesKnn()繪製匹配項。

  • 視覺化關鍵點匹配。

讓我們來看一些使用SIFT特徵檢測器和基於FLANN的匹配器匹配兩幅影像的關鍵點的示例。

輸入影像

我們在下面的示例中使用以下影像作為輸入檔案。



示例

在這個示例中,我們使用SIFT演算法檢測兩幅輸入影像的關鍵點和描述符,並使用帶knn基於FLANN的匹配器匹配描述符。我們還應用比率測試來僅查詢良好的匹配項。我們還繪製關鍵點和匹配項。

# import required libraries import numpy as np import cv2 from matplotlib import pyplot as plt # read two input images img1 = cv2.imread('car.jpg',0) img2 = cv2.imread('car-rotated-crop.jpg',0) # Initiate SIFT detector sift = cv2.SIFT_create() # find the keypoints and descriptors with SIFT kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) # FLANN parameters FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5) search_params = dict(checks=50) # or pass empty dictionary # apply FLANN based matcher with knn flann = cv2.FlannBasedMatcher(index_params,search_params) matches = flann.knnMatch(des1,des2,k=2) # Need to draw only good matches, so create a mask matchesMask = [[0,0] for i in range(len(matches))] # ratio test as per Lowe's paper for i,(m,n) in enumerate(matches): if m.distance < 0.1*n.distance: matchesMask[i]=[1,0] draw_params = dict(matchColor = (0,255,0),singlePointColor = (255,0,0),matchesMask = matchesMask,flags = 0) img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params) plt.imshow(img3),plt.show()

輸出

執行上述Python程式時,它將生成以下輸出視窗:


更新於:2022年12月5日

4K+ 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始
廣告