天天看點

ORB特征檢測原理(含使用代碼)

文章目錄

    • 概要(簡述)
          • 1)尋找特征點:
          • 2)描述特征點:
          • 3)特征點比對:
    • 使用方法
          • 1)opencv中調用方法
          • 2)實際代碼使用方法
    • 附錄(詳解)(轉)
      • 1.特征點的檢測
      • 2.特征點的描述
        • 2.1 計算特征描述子
        • 2.2 理想的特征點描述子應該具備的屬性
      • 3.特征點的比對

概要(簡述)

ORB - (Oriented Fast and Rotated BRIEF)算法是基于FAST特征檢測與BRIEF特征描述子比對實作,相比BRIEF算法中依靠随機方式擷取而值點對,ORB通過FAST方法,FAST方式尋找候選特征點方式是假設灰階圖像像素點A周圍的像素存在連續大于或者小于A的灰階值,ORB的步驟如下:

1)尋找特征點:

在要觀察的像素點P周圍找多個點進行比較,為了加快過程,一般為16、12、9或4個進行比較;如果滿足周圍有連續的多個點的像素同時大于或同時小于P點的像素,則像素點P被标記為候選特征點,然後通過門檻值進行最終的篩選即可得到ORB特征點。

2)描述特征點:

使用BRIEF建構特征描述子,首先在P點周圍找特征點對,然後對選取的點對進行T操作,得到0和1 的序列,可按照點對的位置進行排列;

3)特征點比對:

用2)建構的特征描述子(1和0組成的二進制序列)進行比較,相似度=(相同的個數)/(總個數);這就要求兩個特征的描述子大小和順序必須相同。

使用方法

1)opencv中調用方法
static Ptr<ORB> cv::ORB::create	(
	int nfeatures = 500,                                   //nfeatures 最終輸出最大特征點數目
	float scaleFactor = 1.2f,                            // scaleFactor 金字塔上采樣比率
	int nlevels = 8,                                            // nlevels 金字塔層數
	int edgeThreshold = 31,                                // edgeThreshold 邊緣門檻值
	int firstLevel = 0,
	int WTA_K = 2,                                                // WTA_K這個是跟BRIEF描述子用的
	ORB::ScoreType 	scoreType = ORB::HARRIS_SCORE,        //  scoreType 對所有的特征點進行排名用的方法
	int patchSize = 31,
	int fastThreshold = 20 
)
           
2)實際代碼使用方法
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
	Mat src = imread("test.png");
	auto orb_detector = ORB::create(1000);
	vector<KeyPoint> kpts;
	orb_detector->detect(src, kpts);
	Mat result = src.clone();
	drawKeypoints(src, kpts, result, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
	imshow("ORB-detector", result);
	imwrite("result.png", result);
	waitKey(0);
	return 0;
}
           

附錄(詳解)(轉)

下面為實際參考的文章,一并附上,轉載請注明出處:http://blog.csdn.net/yang843061497/article/details/38553765

1.特征點的檢測

圖像的特征點可以簡單的了解為圖像中比較顯著顯著的點,如輪廓點,較暗區域中的亮點,較亮區域中的暗點等。

ORB特征檢測原理(含使用代碼)

ORB采用FAST(features from accelerated segment test)算法來檢測特征點。FAST核心思想就是找出那些卓爾不群的點,即拿一個點跟它周圍的點比較,如果它和其中大部分的點都不一樣就可以認為它是一個特征點。

ORB特征檢測原理(含使用代碼)

備注:每個小方格代表一個像素,方格内的顔色隻是為了便于區分,不代表該像素點的顔色。

FAST具體計算過程:

  1. 從圖檔中選取一個像素點P,下面我們将判斷它是否是一個特征點。我們首先把它的密度(即灰階值)設為Ip。
  2. 設定一個合适的阙值t :當2個點的灰階值之差的絕對值大于t時,我們認為這2個點不相同。
  3. 考慮該像素點周圍的16個像素。(見上圖)
  4. 現在如果這16個點中有連續的n個點都和點不同,那麼它就是一個角點。 這裡n設定為12。
  5. 我們現在提出一個高效的測試,來快速排除一大部分非特征點的點。該測試僅僅檢查在位置1、9、5和13四個位置的像素(首先檢查1和9,看它們是否和點相同。如果是,再檢查5和13)。如果是一個角點,那麼上述四個像素點中至少有3個應該和點相同。如果都不滿足,那麼不可能是一個角點。
    ORB特征檢測原理(含使用代碼)
    圖中紅色的點為使用FAST算法找到的特征點。

2.特征點的描述

2.1 計算特征描述子

得到特征點後我們需要以某種方式F描述這些特征點的屬性。這些屬性的輸出我們稱之為該特征點的描述子(Feature DescritorS).ORB采用BRIEF算法來計算一個特征點的描述子。BRIEF算法的核心思想是在關鍵點P的周圍以一定模式選取N個點對,把這N個點對的比較結果組合起來作為描述子。

ORB特征檢測原理(含使用代碼)

具體來講分為以下幾步。

1.以關鍵點P為圓心,以d為半徑做圓O。

2.在圓O内某一模式選取N個點對。這裡為友善說明,N=4,實際應用中N可以取512.

假設目前選取的4個點對如上圖所示分别标記為:

ORB特征檢測原理(含使用代碼)

3.定義操作T

ORB特征檢測原理(含使用代碼)

4.分别對已選取的點對進行T操作,将得到的結果進行組合。

假如:

ORB特征檢測原理(含使用代碼)

則最終的描述子為:1011

2.2 理想的特征點描述子應該具備的屬性

在現實生活中,我們從不同的距離,不同的方向、角度,不同的光照條件下觀察一個物體時,物體的大小,形狀,明暗都會有所不同。但我們的大腦依然可以判斷它是同一件物體。理想的特征描述子應該具備這些性質。即,在大小、方向、明暗不同的圖像中,同一特征點應具有足夠相似的描述子,稱之為描述子的可複現性。

ORB特征檢測原理(含使用代碼)

當以某種理想的方式分别計算上圖中紅色點的描述子時,應該得出同樣的結果。即描述子應該對光照(亮度)不敏感,具備尺度一緻性(大小 ),旋轉一緻性(角度)等。

上面我們用BRIEF算法得到的描述子并不具備以上這些性質。是以我們得想辦法改進我們的算法。ORB并沒有解決尺度一緻性問題,在OpenCV的ORB實作中采用了圖像金字塔來改善這方面的性能。ORB主要解決BRIEF描述子不具備旋轉不變性的問題。

回顧一下BRIEF描述子的計算過程:在目前關鍵點P周圍以一定模式選取N個點對,組合這N個點對的T操作的結果就為最終的描述子。當我們選取點對的時候,是以目前關鍵點為原點,以水準方向為X軸,以垂直方向為Y軸建立坐标系。當圖檔發生旋轉時,坐标系不變,同樣的取點模式取出來的點卻不一樣,計算得到的描述子也不一樣,這是不符合我們要求的。是以我們需要重建立立坐标系,使新的坐标系可以跟随圖檔的旋轉而旋轉。這樣我們以相同的取點模式取出來的點将具有一緻性。

打個比方,我有一個印章,上面刻着一些直線。用這個印章在一張圖檔上蓋一個章子,圖檔上分處直線2頭的點将被取出來。印章不變動的情況下,轉動下圖檔,再蓋一個章子,但這次取出來的點對就和之前的不一樣。為了使2次取出來的點一樣,我需要将章子也旋轉同一個角度再蓋章。(取點模式可以認為是章子上直線的分布情況)

ORB在計算BRIEF描述子時建立的坐标系是以關鍵點為圓心,以關鍵點和取點區域的形心的連線為X軸建立2維坐标系。

ORB特征檢測原理(含使用代碼)

在圖1中,P為關鍵點。圓内為取點區域,每個小格子代表一個像素。現在我們把這塊圓心區域看做一塊木闆,木闆上每個點的品質等于其對應的像素值。根據積分學的知識我們可以求出這個密度不均勻木闆的質心Q。計算公式如下。其中R為圓的半徑。

ORB特征檢測原理(含使用代碼)

我們知道圓心是固定的而且随着物體的旋轉而旋轉。當我們以PQ作為坐标軸時(圖2),在不同的旋轉角度下,我們以同一取點模式取出來的點是一緻的。這就解決了旋轉一緻性的問題。

3.特征點的比對

ORB算法最大的特點就是計算速度快 。 這首先得益于使用FAST檢測特征點,FAST的檢測速度正如它的名字一樣是出了名的快。再次是使用BRIEF算法計算描述子,該描述子特有的2進制串的表現形式不僅節約了存儲空間,而且大大縮短了比對的時間。

例如特征點A、B的描述子如下。

A:10101011

B:10101010

我們設定一個門檻值,比如80%。當A和B的描述子的相似度大于90%時,我們判斷A,B是相同的特征點,即這2個點比對成功。在這個例子中A,B隻有最後一位不同,相似度為87.5%,大于80%。則A和B是比對的。

我們将A和B進行異或操作就可以輕松計算出A和B的相似度。而異或操作可以借組硬體完成,具有很高的效率,加快了比對的速度。比對結果如下。

ORB特征檢測原理(含使用代碼)

繼續閱讀