直接使用surf提取,匹配的效果還是相當糟糕的,如果我們拿著這樣子的匹配結果去實現影象拼接或者物體追蹤,效果肯定是極差的。所以我們需要進一步篩選匹配點,來獲取優秀的匹配點,這就是所謂的「去粗取精」。這裡我們採用了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:一般情況下。
#include
"highgui/highgui.hpp"
#include
"opencv2/nonfree/nonfree.hpp"
#include
"opencv2/legacy/legacy.hpp"
#include
using
namespace cv;
using
namespace std;
intmain()
} mat first_match;
drawmatches
(//使用函式 drawmatches來繪製檢測到的匹配點
image02, keypoint2,
//第一幅影象及其特徵點
image01, keypoint1,
//第二幅影象及其特徵點
goodmatchepoints,
//匹配結果
first_match)
;//生成的影象
}
輸入影象:
輸出影象:
匹配點明顯減少:由特徵點匹配的效果來看,現在的特徵點匹配應該是非常精準了,因為我們已經把不合格的匹配點統統移除出去了。
帶有Lowe s演算法的SIFT特徵提取和匹配
採用lowe s的演算法選出優秀匹配點。include highgui highgui.hpp include opencv2 nonfree nonfree.hpp include opencv2 legacy legacy.hpp include using namespace cv using...
SURF演算法中的ransac演算法
就是首先隨機抽取觀測資料子集,我們假設視為這子集就是 內點 局內點或者局內資料 然後用這子集進行相關的擬合來計算模型引數 或者估計函式 找到這模型 或者函式 以後,利用觀測點 資料 進行是否正確,如果求出來的模型能夠滿足足夠多的資料,我們視為很正確的資料。最後我們採納。但是,如果不適合,也就是說求出...
帶有限制條件的Dijkstra演算法
dist maxnum 源節點到節點i的dist intc maxnum maxnum i 到 j 的距離 path 存放每一次的路徑 sp nodes p 必經點 必經線段中的點存放 sp edge maxnum maxnum 必經線段 i j 置位true 對sp nodes p進行全排列,對每...