特徵匹配之Brute-Force 匹配和FLANN 匹配器

使用 OpenCV 中的蠻力(Brute-Force)匹配和 FLANN 匹配。
1:Brute-Force 匹配的基礎
蠻力匹配器是很簡單的。首先在第一幅圖像中選取一個關鍵點然後依次與第二幅圖像的每個關鍵點進行(描述符)距離測試,最後返回距離最近的關鍵點。
對於 BF 匹配器,我們首先要使用 cv2.BFMatcher() 創建一個 BF-Matcher 對象。它有兩個可選參數。第一個是 normType。它是用來指定要使用的距離測試類型。默認值爲 cv2.Norm_L2。這很適合 SIFT 和 SURF 等(c2.NORM_L1 也可以)。對於使用二進制描述符的 ORB,BRIEF,BRISK算法等,要使用 cv2.NORM_HAMMING,這樣就會返回兩個測試對象之間的漢明距離。如果 ORB 算法的參數設置爲 V T A_K==3 或 4,normType就應該設置成 cv2.NORM_HAMMING2。
第二個參數是布爾變量 crossCheck,默認值爲 False。如果設置爲True,匹配條件就會更加嚴格,只有到 A 中的第 i 個特徵點與 B 中的第 j 個特徵點距離最近,並且 B 中的第 j 個特徵點到 A 中的第 i 個特徵點也是最近(A 中沒有其他點到 j 的距離更近)時纔會返回最佳匹配(i,j)。也就是這兩個特徵點要互相匹配才行。這樣就能提供統一的結果,這可以用來替代 D.Lowe在 SIFT 文章中提出的比值測試方法。
BFMatcher 對象具有兩個方法, BFMatcher.match() 和 BFMatcher.knnMatch()。第一個方法會返回最佳匹配。第二個方法爲每個關鍵點返回 k 個最佳匹配(降序排列之後取前 k 個),其中 k 是由用戶設定的。如果除了匹配之外還要做其他事情的話可能會用上(比如進行比值測試)。
就 像 使 用 cv2.drawKeypoints() 繪 制 關 鍵 點 一 樣, 我 們 可 以 使 用cv2.drawMatches() 來繪製匹配的點。它會將這兩幅圖像先水平排列,然後在最佳匹配的點之間繪製直線(從原圖像到目標圖像)。如果前面使用的是 BF-Matcher.knnMatch(),現在我們可以使用函數 cv2.drawMatchsKnn爲每個關鍵點和它的 k 個最佳匹配點繪製匹配線。如果 k 等於 2,就會爲每個關鍵點繪製兩條最佳匹配直線。如果我們要選擇性繪製話就要給函數傳入一個掩模。

2:FLANN 匹配器
FLANN 是快速最近鄰搜索包(Fast_Library_for_Approximate_Nearest_Neighbors)的簡稱。它是一個對大數據集和高維特徵進行最近鄰搜索的算法的集合,而且這些算法都已經被優化過了。在面對大數據集時它的效果要好於 BFMatcher。
使用 FLANN 匹配,我們需要傳入兩個字典作爲參數。這兩個用來確定要使用的算法和其他相關參數等。第一個是 IndexParams。indexparams = dict(algorithm = FLANNINDEX K DT REE, trees = 5)
各種不同算法的信息可以在 FLANN 文檔中找到。
第二個字典是 SearchParams。用它來指定遞歸遍歷的次數。值越高結 果 越 準 確, 但是消耗的時間也越多。 如果你想修改這個值, 傳入參 數:searchparams = dict(checks = 100)。

使用一個查詢圖像,在其中找到一些特徵點(關鍵點),我們又在另一幅圖像中也找到了一些特徵點,最後對這兩幅圖像之間的特徵點進行匹配。簡單來說就是:我們在一張雜亂的圖像中找到了一個對象(的某些部分)的位置。這些信息足以幫助我們在目標圖像中準確的找到(查詢圖像)對象。
爲了達到這個目的可以使用 calib3d 模塊中的 cv2.findHomography()函數。如果將這兩幅圖像中的特徵點集傳給這個函數,他就會找到這個對象的透視圖變換。然後就可以使用函數cv2.perspectiveTransform() 找到這個對象了。至少要 4 個正確的點才能找到這種變換。
我們已經知道在匹配過程可能會有一些錯誤,而這些錯誤會影響最終結果。爲了解決這個問題,算法使用 RANSAC 和 LEAST_MEDIAN(可以通過參數來設定)。所以好的匹配提供的正確的估計被稱爲 inliers,剩下的被稱爲outliers。cv2.findHomography() 返回一個掩模,這個掩模確定了 inlier 和outlier 點。

SIFT特徵提取原理介紹:http://blog.csdn.net/chuhang_zhqr/article/details/50890546

發佈了98 篇原創文章 · 獲贊 104 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章