(二)特徵匹配

2021-10-14 01:58:17 字數 1981 閱讀 1761

特徵匹配

特徵匹配,又可以稱之為資料關聯。在影象領域中,特徵匹配的作用非常大。比如:

在影象拼接中,需要進行特徵匹配,方便求出單應矩陣以拼接兩幅影象;

在三維重建中,需要進行特徵匹配,方便求出變換矩陣以及三角化特徵點;

在影象檢索中,可以通過特徵點在資料庫中檢索,查詢到特徵匹配數量最多的識別結果;

...

檢索部分暫時不提,畢竟涉及到了複雜的資料結構。並且在slam中用的並不多,雖然在回環檢測中需要用到。但是,這是後續的事情了。

> >特徵匹配的前提:

特徵描述子的特異性和可重複性:特徵描述子是在影象中利用鄰域資訊對關鍵點進行描述,得到一組描述向量。通常對於兩幀具有部分重複紋理的地方,同乙個位置的特徵描述子應該是一樣的。但是由於光照、遮擋、旋轉和尺度等變化,導致同樣的地方看起來卻又不太一樣。但是總體來說,只要是同乙個地方,特徵描述子的差別就不應該太大。

相似度度量方法:基於這個事實,特徵匹配的目的就是在兩個有重複紋理的影象中,將同乙個位置的特徵描述子關聯起來。通常特徵描述子是一組向量,比如 $x = $,同理,另一張影象中的同個位置描述向量為 $y = $,將其在超平面中畫出來,就可以通過度量其距離來判斷其相似度。比如 $n = 2/3$ 時,在座標系中畫出來,可以非常直觀的看出來兩個向量的距離。

>>特徵匹配的方法:

在本文中,只介紹兩種常用的方法。

flann快速最近鄰搜尋匹配法;

bruteforce暴力匹配法;

暴力匹配法

假設兩幀影象 $i_, i_$ 中,各自提取了 $500$ 個特徵點,暴力匹配法通過對影象 $i_$ 中任意乙個特徵點 $f_^$,都與影象 $i_$ 中的所有特徵點計算匹配分數。相似度度量方法如前所述,通過對每對特徵點計算歐式距離(orb度量漢明距離),選擇與當前特徵點 $f_^$ 歐式距離最短的特徵點作為最優匹配。

暴力匹配法讓影象 $i_$ 中的所有特徵點都能在影象 $i_$ 中找到匹配點,這也是其被稱之為暴力匹配法的原因。

很明顯,這樣的匹配方法儘管可以獲得足夠多的匹配對,但是摻雜著非常多的錯誤匹配,這些錯誤匹配在後續的應用當中會導致不可挽回的後果。(沒錯,就算用全域性優化也很難救回來的那種)試想一下,在slam當中,由於出現了很多錯誤匹配,在估計幀間相對運動時,進行非線性優化算約束時,因為錯誤匹配約束的加入,將導致幀間運動估計錯誤,甚至不收斂。

而經過實踐,人們發現可以用經驗值來將這些錯誤的匹配盡可能的過濾掉。比如特徵點間的距離小於最大距離的一半,或者大於最小距離的兩倍等。對初始匹配進行一次過濾,可以得到較好的匹配結果。比如下圖所示:

暴力匹配法,通常搜尋時間是 $o(n)$,即 $1$ 對 $n$。不僅搜尋效率比較低,並且其匹配效果比較差。

快速最近鄰搜尋匹配法

快速最近鄰搜尋匹配是相比暴力匹配法,在搜尋策略上有所改進。

flann的搜尋匹配主要分兩步,第一步便是建立索引,第二步是根據索引進行搜尋。

索引方式包括:線性索引、kd-tree索引、k均值索引、復合索引、lsh方法索引、自動索引六種。具體介紹可以詳見:[opencv——kd tree](

搜尋方式包括:搜尋k近鄰,搜尋半徑近鄰。搜尋k近鄰可以指定返回查詢到的最相似的幾個。而搜尋半徑近鄰可以設定搜尋半徑,在搜尋半徑中找匹配點。

flann匹配效率根據索引型別有所變化,比如選擇線性的搜尋索引時,就是暴力匹配法。而如果選擇kd-tree作為索引時,就會有對數級的匹配效率,相比暴力匹配法有所提高。此外,匹配效果也有所提高。比如下圖所示:

ps:兩種匹配方法我已經上傳到github上的特徵匹配模組中,歡迎參考。

SIFT特徵匹配

影象特徵分很多種,例如顏色特徵 紋理特徵 形狀特徵 空間關係特徵等。常用的特徵為sift特徵。sift scale invariantfeaturetransform,sift 具有以下特性 1 對平移 旋轉 伸縮 亮度 遮擋和雜訊等具有良好的不變性,對視覺變化 仿射變換也有一定的穩定性。2 即使少...

特徵點匹配

一 特徵點 角點 匹配 影象匹配能夠應用的場合非常多,如目標跟蹤,檢測,識別,影象拼接等,而角點匹配最核心的技術就要屬角點匹配了,所謂角點匹配是指尋找兩幅影象之間的特徵畫素點的對應關係,從而確定兩幅影象的位置關係。角點匹配可以分為以下四個步驟 1 提取檢測子 在兩張待匹配的影象中尋找那些最容易識別的...

opencv python 特徵匹配

feature matching brute force匹配非常簡單,首先在第一幅影象中選取乙個關鍵點然後依次與第二幅影象的每個關鍵點進行 描述符 距離測試,最後返回距離最近的關鍵點.對於bf匹配器,首先我們必須使用cv2.bfmatcher 建立bfmatcher物件。它需要兩個可選的引數.第乙個...