ORB特徵點檢測

2021-09-06 19:26:08 字數 4204 閱讀 9266

這篇文章我們將介紹一種新的具有區域性不變性的特徵 —— orb特徵,從它的名字中可以看出它是對fast特徵點與breif特徵描述子的一種結合與改進,這個演算法是由ethan rublee,vincent rabaud,kurt konolige以及gary r.bradski在2023年一篇名為「orb:an efficient alternative to sift or surf」的文章中提出。就像文章題目所寫一樣,orb是除了sift與surf外乙個很好的選擇,而且它有很高的效率,最重要的一點是它是免費的,sift與surf都是有專利的,你如果在商業軟體中使用,需要購買許可。

fast特徵點檢測

brief特徵描述子

orb特徵是將fast特徵點的檢測方法與brief特徵描述子結合起來,並在它們原來的基礎上做了改進與優化。

首先,它利用fast特徵點檢測的方法來檢測特徵點,然後利用harris角點的度量方法,從fast特徵點從挑選出harris角點響應值最大的$n$個特徵點。其中harris角點的響應函式定義為:

$$r=det \boldsymbol - \alpha(trace\boldsymbol)^2$$

我們知道fast特徵點是沒有尺度不變性的,所以我們可以通過構建高斯金字塔,然後在每一層金字塔影象上檢測角點,來實現尺度不變性。那麼,對於區域性不變性,我們還差乙個問題沒有解決,就是fast特徵點不具有方向,orb的**中提出了一種利用灰度質心法來解決這個問題,灰度質心法假設角點的灰度與質心之間存在乙個偏移,這個向量可以用於表示乙個方向。對於任意乙個特徵點$p$來說,我們定義$p$的鄰域畫素的矩為:

$$m_ = \sum_x^py^qi(x,y)$$

其中$i(x,y)$為點$(x,y)$處的灰度值。那麼我們可以得到影象的質心為:

$$c = \left(\frac}},\frac}}\right)$$

那麼特徵點與質心的夾角定義為fast特徵點的方向:

$$\theta = arctan(m_,m_)$$

為了提高方法的旋轉不變性,需要確保$x$和$y$在半徑為$r$的圓形區域內,即$x,y\in [-r,r]$,$r$等於鄰域半徑。

orb選擇了brief作為特徵描述方法,但是我們知道brief是沒有旋轉不變性的,所以我們需要給brief加上旋轉不變性,把這種方法稱為「steer breif」。對於任何乙個特徵點來說,它的brief描述子是乙個長度為$n$的二值碼串,這個二值串是由特徵點周圍$n$個點對($2n$個點)生成的,現在我們將這$2n$個點$(x_i,y_i),i = 1,2,\cdots,2n$組成乙個矩陣$s$

$$s =\beginx_1&x_2&\cdots&x_\\y_1&y_2&\cdots&y_\end $$

calonder建議為每個塊的旋轉和投影集合分別計算brief描述子,但代價昂貴。orb中採用了乙個更有效的方法:使用鄰域方向$\theta$和對應的旋轉矩陣$r_$,構建$s$的乙個校正版本$s_$

$$s_ = r_s$$

其中$$r_ = \begincos\theta & sin\theta \\ –sin\theta &cos\theta\end$$

而$\theta$即我們在1.2中為特徵點求得的主方向。

實際上,我們可以把角度離散化,即把360度分為12份,每乙份是30度,然後我們對這個12個角度分別求得乙個$s_$,這樣我們就建立了乙個查詢表,對於每乙個$\theta$,我們只需查表即可快速得到它的點對的集合$s_$。

brief令人驚喜的特性之一是:對於$n$維的二值串的每個比特徵位,所有特徵點在該位上的值都滿足乙個均值接近於0.5,而方差很大的高斯分布。方差越大,說明區分性越強,那麼不同特徵點的描述子就表現出來越大差異性,對匹配來說不容易誤配。但是當我們把brief沿著特徵點的方向調整為steered brief時,均值就漂移到乙個更加分布式的模式。可以理解為有方向性的角點關鍵點對二值串則展現了乙個更加均衡的表現。而且**中提到經過pca對各個特徵向量進行分析,得知steered brief的方差很小,判別性小,各個成分之間相關性較大。

首先建立乙個大約300k關鍵點的測試集,這些關鍵點來自於pascal2006集中的影象。

對於這300k個關鍵點中的每乙個特徵點,考慮它的$31\times31$的鄰域,我們將在這個鄰域內找一些點對。不同於brief中要先對這個patch內的點做平滑,再用以patch中心為原點的高斯分布選擇點對的方法。orb為了去除某些雜訊點的干擾,選擇了乙個$5\times5$大小的區域的平均灰度來代替原來乙個單點的灰度,這裡$5\times5$區域內影象平均灰度的計算可以用積分圖的方法。我們知道$31\times31$的patch裡共有$n = (31-5+1)\times(31-5+1)$個這種子視窗,那麼我們要$n$個子視窗中選擇2個子視窗的話,共有$c_n^2$種方法。所以,對於300k中的每乙個特徵點,我們都可以從它的$31\times31$大小的鄰域中提取出乙個很長的二進位制串,長度為$m = c_n^2$,表示為$$binarray = [p_1,p_2,\cdots,p_m],p_i\in\$$

那麼當300k個關鍵點全部進行上面的提取之後,我們就得到了乙個$300k\times m$的矩陣,矩陣中的每個元素值為0或1。

對該矩陣的每個列向量,也就是每個點對在300k個特徵點上的測試結果,計算其均值。把所有的列向量按均值進行重新排序。排好後,組成了乙個向量$t$,$t$的每乙個元素都是乙個列向量。

進行貪婪搜尋:從$t$中把排在第一的那個列放到$r$中,$t$中就沒有這個點對了測試結果了。然後把$t$中的排下乙個的列與$r$中的所有元素比較,計算它們的相關性,旭果相關超過了某一事先設定好的閾值,就扔了它,否則就把它放到$r$裡面。重複上面的步驟,只到$r$中有256個列向量為止。如果把$t$全找完也,也沒有找到256個,那麼,可以把相關的閾值調高一些,再重試一遍。

這樣,我們就得到了256個點對。上面這個過程我們稱它為rbrief。

orb中有很多引數可以設定,在opencv中它可以通過orb來建立乙個orb檢測器。

orb::orb(int nfeatures=500, float scalefactor=1.2f, int nlevels=8, int edgethreshold=31, int firstlevel=0, int wta_k=2, int scoretype=orb::harris_score, int patchsize=31)
下面介紹一下各個引數的含義:

nfeatures- 最多提取的特徵點的數量;

scalefactor- 金字塔影象之間的尺度引數,類似於sift中的$k$;

nlevels– 高斯金字塔的層數;

edgethreshold– 邊緣閾值,這個值主要是根據後面的patchsize來定的,靠近邊緣edgethreshold以內的畫素是不檢測特徵點的。

firstlevel- 看過sift都知道,我們可以指定第一層的索引值,這裡預設為0。

wet_k- 用於產生biref描述子的 點對的個數,一般為2個,也可以設定為3個或4個,那麼這時候描述子之間的距離計算就不能用漢明距離了,而是應該用乙個變種。opencv中,如果設定wet_k = 2,則選用點對就只有2個點,匹配的時候距離引數選擇norm_hamming,如果wet_k設定為3或4,則biref描述子會選擇3個或4個點,那麼後面匹配的時候應該選擇的距離引數為norm_hamming2。

scoretype- 用於對特徵點進行排序的演算法,你可以選擇harris_score,也可以選擇fast_score,但是它也只是比前者快一點點而已。

patchsize– 用於計算biref描述子的特徵點鄰域大小。

[2] 看orb特徵,一些理解和解釋

[3] opencv tutorials

ORB特徵點檢測

這篇文章我們將介紹一種新的具有區域性不變性的特徵 orb特徵,從它的名字中可以看出它是對fast特徵點與breif特徵描述子的一種結合與改進,這個演算法是由ethan rublee,vincent rabaud,kurt konolige以及gary r.bradski在2011年一篇名為 orb ...

ORB特徵點檢測與匹配

orb特徵是目前最優秀的特徵提取與匹配演算法之一,下面具體講解一下 特徵點的檢測 影象的特徵點可以簡單的理解為影象中比較顯著顯著的點,如輪廓點,較暗區域中的亮點,較亮區域中的暗點等。orb採用fast features from accelerated segment test 演算法來檢測特徵點。...

目標特徵檢測之ORB

orb oriented fast and rotated brief 它是opencv labs 在2011年提出的,首先它是免費的,而sift 和 surf 是受專利保護,並且要收費的,orb 是他們的乙個替代品,在計算能力比有限的裝置上適合這個東西。它的效果 sift orb surf,計算速...