【總結】FLANN特徵匹配

工作需要用到FLANN特徵匹配技術,在這裏記錄一些關鍵知識點。

ORB (Oriented FAST and Rotated BRIEF)  算法簡介

   分爲兩部分:

  • 特徵點提取 -由FAST(Features from Accelerated Segment Test)算法發展來的
  • 特徵點描述 -根據BRIEF(Binary Robust IndependentElementary Features)特徵描述算法改進的

暴力匹配(cv2.BFMatcher)

即兩兩匹配。該算法不做任何優化,假設ORB算法從圖片A中提取了m個特徵描述符,從圖片B中提取了n個特徵描述符。暴力匹配器將圖片A中m個描述符逐一和圖片B中的n個特徵描述符求距離,然後對得到的距離排序,取距離最近的一個作爲最佳匹配點,這種方法簡單粗暴,其結果也是顯而易見的,會有大量的錯誤匹配,這就需要使用一些機制來過濾掉錯誤的匹配(比如下面的Lowe’s算法

 

cv2.BFMatcher參數說明:

 normType:它是用來指定要使用的距離測試類型。默認值爲cv2.Norm_L2。這很適合SIFT和SURF等(c2.NORM_L1也可)。對於使用二進制描述符的ORB、BRIEF和BRISK算法等,要使用cv2.NORM_HAMMING,這樣就會返回兩個測試對象之間的漢明距離。如果ORB算法的參數設置爲WTA_K==3或4,normType就應該設置成cv2.NORM_HAMMING2。
crossCheck:使用交叉匹配的方法來濾除錯誤匹配,默認值爲False。若設置爲True,匹配條件就會更加嚴格,只有到圖片A中的第i個特徵點與圖片B中的第j個特徵點距離最近,反過來,還要圖片B中的第j個特徵點到圖片A中的第i個特徵點也是最近,纔會認爲他們是最佳匹配(i,j)並返回,即:這兩個特徵點要互相匹配才行。(你喜歡我,我也喜歡你,單戀可不行...)
 

暴力匹配器BFMatcher有兩個重要的方法,分別是BFMatcher.match() BFMatcher.knnMatch()。送入查詢圖片A和目標圖片B

match() 方法會爲圖片A從圖片B中找到最佳的單個匹配點;

knnMatch()方法會爲圖片A從圖片B中找到最佳的前k個匹配點,k值由用戶指定。當我們需要做一些額外的工作時,這種方法會很有用。

 

Lowe’s算法:

爲了進一步篩選匹配點,獲取優秀的匹配點,即“去粗取精”。爲了排除因爲圖像遮擋和背景混亂而產生的無匹配關係的關鍵點,SIFT的作者Lowe提出了比較最近鄰距離與次近鄰距離的SIFT匹配方式:

取一幅圖像中的一個SIFT關鍵點,並找出其與另一幅圖像中歐式距離最近的前兩個關鍵點,在這兩個關鍵點中,如果最近的距離除以次近的距離得到的比率ratio少於某個閾值T,則接受這一對匹配點。因爲對於錯誤匹配,由於特徵空間的高維性,相似的距離可能有大量其他的錯誤匹配,從而它的ratio值比較高。顯然降低這個比例閾值T,SIFT匹配點數目會減少,但更加穩定,反之亦然。
  Lowe推薦ratio的閾值爲0.8;

有網友對大量存在任意尺度、旋轉和亮度變化的兩幅圖片進行匹配,結果表明ratio取值在0. 4~0. 6 之間最佳,小於0. 4的很少有匹配點,大於0. 6的則存在大量錯誤匹配點,所以建議ratio的取值原則如下(僅供參考):

ratio=0. 4:對於準確度要求高的匹配;

ratio=0. 6:對於匹配點數目要求比較多的匹配;

ratio=0. 5:一般情況下。

Lowe's改進:可以反過來使用最近鄰比次近鄰,在匹配中可以作爲置信度來使用,當滿足最近鄰比次近鄰大於某個值的時候,作爲某個條件的判別置信度;比如可以應用在雙目視覺立體匹配中的視差選擇與優化環節中(論文正在編寫中);

下面博客提到了ORB(二值特徵編碼)如何跟FLANN結合使用(很詳細)

https://www.jianshu.com/p/42b61d42e0bc

需要修改的關鍵代碼如下:

FLANN_INDEX_LSH=6
indexParams=dict(algorithm=FLANN_INDEX_LSH, 
                 table_number = 6, #12
                 key_size = 12,    #20
                 multi_probe_level = 1)#2
searchParams=dict(checks=100)

GPU加速的orb算法相關博客(c++):

https://blog.csdn.net/bisheng250/article/details/53691099

https://blog.csdn.net/dlphay/article/details/79021472

 

PyCUDA官方教程:

https://documen.tician.de/pycuda/ (英文)

https://blog.cycleuser.org/pycuda-tutorial-zhong-wen-ban.html  (中文)

https://www.cnblogs.com/noluye/p/11517489.html

https://blog.csdn.net/qq_36387683/article/details/81075870 (pycuda和numba的比較)

https://blog.csdn.net/u013390476/article/details/82194709

 

利用深度學習來做特徵匹配:

論文筆記之:MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching

https://www.cnblogs.com/wangxiaocvpr/p/5515181.html

裏面關鍵一句:雙塔的輸出串聯在一起作爲度量網絡的輸入!

基於深度學習的圖像匹配技術專題

https://blog.csdn.net/aaron121211/article/details/78707215

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章