1. 程式人生 > >ORB特徵點檢測

ORB特徵點檢測

Oriented FAST and Rotated BRIEF

這篇文章我們將介紹一種新的具有區域性不變性的特徵 —— ORB特徵,從它的名字中可以看出它是對FAST特徵點與BREIF特徵描述子的一種結合與改進,這個演算法是由Ethan Rublee,Vincent Rabaud,Kurt Konolige以及Gary R.Bradski在2011年一篇名為“ORB:An Efficient Alternative to SIFT or SURF”的文章中提出。就像文章題目所寫一樣,ORB是除了SIFT與SURF外一個很好的選擇,而且它有很高的效率,最重要的一點是它是免費的,SIFT與SURF都是有專利的,你如果在商業軟體中使用,需要購買許可。

如果你對FAST特徵點與BRIEF特徵描述子不瞭解,請先閱讀以下兩篇文章。本文不打算對它們作詳細的演算法說明。

1. ORB的演算法原理

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

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

$$R=det \boldsymbol{M} - \alpha(trace\boldsymbol{M})^2$$

關於$M$的含義和響應函式的由來可以參考

Harris角點檢測這篇文章。

1.1 旋轉不變性

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

$$m_{pq} = \sum_{x,y}x^py^qI(x,y)$$

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

$$C = \left(\frac{m_{10}}{m_{00}},\frac{m_{01}}{m_{00}}\right)$$

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

$$\theta = arctan(m_{01},m_{10})$$

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

1.2 特徵點的描述

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

$$S =\begin{pmatrix}x_1&x_2&\cdots&x_{2n}\\y_1&y_2&\cdots&y_{2n}\end{pmatrix} $$

Calonder建議為每個塊的旋轉和投影集合分別計算BRIEF描述子,但代價昂貴。ORB中採用了一個更有效的方法:使用鄰域方向$\theta$和對應的旋轉矩陣$R_{\theta}$,構建$S$的一個校正版本$S_{\theta}$

$$S_{\theta} = R_{\theta}S$$

其中$$R_{\theta} = \begin{bmatrix}cos\theta & sin\theta \\ –sin\theta &cos\theta\end{bmatrix}$$

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

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

1.3 解決描述子的區分性

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

為了減少Steered BRIEF方差的虧損,並減少二進位制碼串之間的相關性,ORB使用了一種學習的方法來選擇一個較小的點對集合。方法如下:

首先建立一個大約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\{0,1\}$$

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

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

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

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

2. OpenCV中的ORB

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描述子的特徵點鄰域大小。

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/features2d/features2d.hpp>

using namespace cv;

int main(int argc, char** argv) 
{ 
    Mat img_1 = imread("box.png"); 
    Mat img_2 = imread("box_in_scene.png");

    // -- Step 1: Detect the keypoints using STAR Detector 
    std::vector<KeyPoint> keypoints_1,keypoints_2; 
    ORB orb; 
    orb.detect(img_1, keypoints_1); 
    orb.detect(img_2, keypoints_2);

    // -- Stpe 2: Calculate descriptors (feature vectors) 
    Mat descriptors_1, descriptors_2; 
    orb.compute(img_1, keypoints_1, descriptors_1); 
    orb.compute(img_2, keypoints_2, descriptors_2);

    //-- Step 3: Matching descriptor vectors with a brute force matcher 
    BFMatcher matcher(NORM_HAMMING); 
    std::vector<DMatch> mathces; 
    matcher.match(descriptors_1, descriptors_2, mathces); 
    // -- dwaw matches 
    Mat img_mathes; 
    drawMatches(img_1, keypoints_1, img_2, keypoints_2, mathces, img_mathes); 
    // -- show 
    imshow("Mathces", img_mathes);

    waitKey(0); 
    return 0; 
}

image

3. 參考資料

[1] Ethan Rublee, Vincent Rabaud, Kurt Konolige, Gary R. Bradski: ORB: An efficient alternative to SIFT or SURF. ICCV 2011: 2564-2571.

相關推薦

ORB特徵檢測

Oriented FAST and Rotated BRIEF 這篇文章我們將介紹一種新的具有區域性不變性的特徵 —— ORB特徵,從它的名字中可以看出它是對FAST特徵點與BREIF特徵描述子的一種結合與改進,這個演算法是由Ethan Rublee,Vincent Rabaud,Kurt Kono

opencv筆記(1)——特徵檢測ORB特徵提取

ORB演算法原理解讀 #include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/hig

第三篇:基於深度學習的人臉特徵檢測 - 資料集整理

https://yinguobing.com/facial-landmark-localization-by-deep-learning-data-collate/ 在上一篇博文中,我們已經下載到了包括300-W、LFPW、HELEN、AFW、IBUG和300-VW在內的6個數據集,初步估算有2

第五篇:基於深度學習的人臉特徵檢測 - 生成TFRecord檔案

在上一篇博文中,我們已經獲取到了所有樣本的面部區域,並且對面部區域的有效性進行了驗證。當使用TensorFlow進行神經網路訓練時,涉及到的大量IO操作會成為訓練速度的瓶頸。為了加快訓練的速度,方便後期利用與復現,需要將所有用到的資料打包成為TFRecord檔案,一種TensorFlow原生支援的資

第二篇:基於深度學習的人臉特徵檢測 - 資料與方法(轉載)

https://yinguobing.com/facial-landmark-localization-by-deep-learning-data-and-algorithm/ 在上一篇博文中,我們瞭解了人臉檢測與面部特徵點檢測的背景,並提到了當前技術方案存在特徵點位置不穩定的缺點,需要新的解決

第一篇:基於深度學習的人臉特徵檢測 - 背景(轉載)

轉載自:https://yinguobing.com/facial-landmark-localization-by-deep-learning-background/ 人臉檢測與識別一直是機器學習領域的一大熱點。人臉檢測是指從影象中檢測出人臉區域。人臉識別則是判斷特定的臉部影象是否與某個人對應

ORB特徵原理(淺顯版)

轉自https://www.jianshu.com/p/9ee6b2145eaa 緒論 假如我有2張美女圖片,我想確認這2張圖片中美女是否是同一個人。這太簡單了,以我專研島國動作片錘鍊出來的火眼金睛只需輕輕掃過2張圖片就可以得出結論。但是,如果我想讓計算機來完成這個功能就困難重重了:再性感的

opencv學習筆記二十九:SIFT特徵檢測與匹配

SIFT(Scale-invariant feature transform)是一種檢測區域性特徵的演算法,該演算法通過求一幅圖中的特徵點(interest points,or corner points)及其有關scale 和 orientation 的描述子得到特徵並進行

opencv學習筆記三十六:AKAZE特徵檢測與匹配

KAZE是日語音譯過來的 , KAZE與SIFT、SURF最大的區別在於構造尺度空間,KAZE是利用非線性方式構造,得到的關鍵點也就更準確(尺度不變性 ); Hessian矩陣特徵點檢測 ,方向指定,基於一階微分影象(旋轉不變性 ) ; 描述子生成 ,歸一化處理(光照不變

第二篇:基於深度學習的人臉特徵檢測

在上一篇博文中,我們瞭解了人臉檢測與面部特徵點檢測的背景,並提到了當前技術方案存在特徵點位置不穩定的缺點,需要新的解決方案。那麼,目前又有哪些方案可以用呢? Github rocks! 在程式設計師眼中,Github恐怕是比微信還要重要的存在了吧!以“face lan

【OpenCV入門教程之十七】OpenCV重對映 SURF特徵檢測合輯

                本篇文章中,我們一起探討了OpenCV中重對映和SURF特徵點檢測相關的知識點,主要一起了解OpenCV中重對映相關的函式remap,SURF演算法在OpenCV中的體現與應用。此博文一共有三個配套的麻雀雖小但五臟俱全的示例程式,其經過淺墨詳細註釋過的程式碼都在文中貼出,且文章

【learnOpenCv】Facial Landmark Detection:人臉特徵檢測的一些應用

偶然看到的,感覺寫的很好,隨手大概內容翻譯轉過來,如有侵權請告知刪除。 原文連結:https://www.learnopencv.com/facial-landmark-detection/ 目前在計算機視覺領域,人臉方向的研究非常之多。人臉分析最常見的應用是人臉識別,但

FAST特徵檢測的matlab實現

FAST特徵點檢測的matlab原始碼實現 1. 簡介 2. FAST的原理介紹 2.1 特徵點檢測 2.2 極值點抑制 3. matlab原始碼實現 4. 結果展示 1. 簡介 Features

影象區域性特徵檢測演算法綜述

研究影象特徵檢測已經有一段時間了,影象特徵檢測的方法很多,又加上各種演算法的變形,所以難以在短時間內全面的瞭解,只是對主流的特徵檢測演算法的原理進行了學習。總體來說,影象特徵可以包括顏色特徵、紋理特等、形狀特徵以及區域性特徵點等。其中區域性特點具有很好的穩定性,不容易受外界環境的干擾,本篇文章也是對這方面知識

特徵檢測學習_2(surf演算法)

在上篇部落格特徵點檢測學習_1(sift演算法) 中簡單介紹了經典的sift演算法,sift演算法比較穩定,檢測到的特徵點也比較多,其最大的確定是計算複雜度較高。後面有不少學者對其進行了改進,其中比較出名的就是本文要介紹的surf演算法,surf的中文意思為快速魯棒特徵。本

FAST特徵檢測

Features From Accelerated Segment Test 1. FAST演算法原理       部落格中已經介紹了很多影象特徵檢測運算元,我們可以用LoG或者DoG檢測影象中的Blobs(斑點檢測),可以根據影象區域性的自相關函式來求得Harris角點(Harris角點),後面又提到了

SURF特徵檢測與匹配之誤匹配刪除

SURF特徵點檢測與匹配之誤匹配點刪除 SURF(SpeededUp Robust Feature)是加速版的具有魯棒性的演算法,是SIFT演算法的加速版。 但是SURF特徵匹配之後有大量的誤匹配點,需要對這些誤匹配點進行刪除。 這裡不從理論上講解SURF原理等,直接說用

OpenCV特徵檢測------Surf(特徵篇)

Surf(Speed Up Robust Feature)Surf演算法的原理                                                                          1.構建Hessian矩陣構造高斯金字塔尺度空間其

特徵檢測學習(surf演算法)

  在上篇部落格特徵點檢測學習_1(sift演算法) 中簡單介紹了經典的sift演算法,sift演算法比較穩定,檢測到的特徵點也比較多,其最大的確定是計算複雜度較高。後面有不少學者對其進行了改進,其中比較出名的就是本文要介紹的surf演算法,surf的中文意思為快速魯

特徵檢測學習_1(sift演算法)

 sift演算法在cv領域的重要性不言而喻,該作者的文章引用率在cv界是number1.本篇部落格只是本人把sift演算法知識點整理了下,以免忘記。本文比較早的一篇博文opencv原始碼解析之(3):特徵點檢查前言1 中有使用opencv自帶的sift做了個簡單的實驗,而這次主要是利用Rob Hess的s