OpenCV Fast角點檢測演算法的使用和原理

2021-10-06 04:47:36 字數 2915 閱讀 4783

**及解析

)# 讀取

# initiate fast object with default values

fast = cv2.fastfeaturedetector_create(

)# 例項化fast

# find and draw the keypoints

kp = fast.detect(img,

none

)# 找出中的關鍵點

img2 = cv2.drawkeypoints(img, kp,

none

, color=

(255,0

,0))

# 畫出檢測出來的點

cv2.imshow(

'fast.png'

, img2)

# 顯示

cv2.waitkey(

0)fast角點檢測的演算法原理我們可以根據影象區域性的自相關函式來求得harris角點,雖然在有些實驗環境中已經達到了實時,但是我們實踐工程應用中,特徵點的提取與匹配只是整個應用演算法中的一部分,所以我們對於特徵點的提取必須有更高的要求fast角點定義為:若某畫素點與其周圍領域內足夠多的畫素點處於不同的區域,則該畫素點可能為角點。也就是某些屬性與眾不同,考慮灰度影象,即若該點的灰度值比其周圍領域內足夠多的畫素點的灰度值大或者小,則該點可能為角點。

fast演算法步驟

從中選取乙個畫素p,下面我們將判斷它是否是乙個特徵點。我們首先把它的亮度值設為ip。

設定乙個合適的閾值t

慮以該畫素點為中心的乙個半徑等於3畫素的離散化的bresenham圓,這個圓的邊界上有16個畫素(如下圖所示)

如果在這個大小為16個畫素的圓上有n個連續的畫素點,它們的畫素值要麼都比ip+t大,要麼都比ip−t小,那麼它就是乙個角點。(如上圖中的白色虛線所示)。n的值可以設定為12或者9,實驗證明選擇9可能會有更好的效果。

上面的演算法中,對於影象中的每乙個點,我們都要去遍歷其鄰域圓上的16個點的畫素,效率較低。

我們下面提出了一種高效的測試(high-speed test)來快速排除一大部分非角點的畫素。

該方法僅僅檢查在位置1,9,5和13四個位置的畫素,首先檢測位置1和位置9,如果它們都比閾值暗或比閾值亮,再檢測位置5和位置13。

如果p是乙個角點,那麼上述四個畫素點中至少有3個應該必須都大於ip+t或者小於ip−t,因為若是乙個角點,超過四分之三圓的部分應該滿足判斷條件。

如果不滿足,那麼p不可能是乙個角點。

對於所有點做上面這一部分初步的檢測後,符合條件的將成為候選的角點,我們再對候選的角點,做完整的測試,即檢測圓上的所有點。

雖然演算法效率很高,但是有點一些缺點:

當我們設定n<12時就不能使用快速演算法來過濾非角點的點;

檢測出來的角點不是最優的,這是因為它的效率取決於問題的排序與角點的分布;

對於角點分析的結果被丟棄了;

多個特徵點容易擠在一起。

使用機器學習做乙個角點分類器

首先選取你進行角點提取的應用場景下很多張的測試

執行fast角點檢測演算法來獲取測試集上的所有角點特徵

對於每個角點,我們把它鄰域圓上的16個點儲存下來儲存在乙個vector內,處理所有步驟2中得到的角點,並把它們儲存在p中。

對於影象上的點p,它周圍鄰域圓上位置為x,x∈的點表示為p→x,可以用下面的判斷公式將該點p→x分為3類:

設p為訓練影象集中所有畫素點的集合,我們任意16個位置中的乙個位置x,可以把集合p分為三個部分pd,ps和pb,其中pd的定義如下,ps和pb的定義與其類似pb=

p∈p:

sp→x

=bpb=pb

=p∈p

:sp→

x=b。換句話說,對於任意給定的位置x,它都可以把所有影象中的點分為三類,第一類pd包括了所有位置x處的畫素在閾值t下暗於中心畫素,第二類ps包括了所有位置x處的畫素在閾值t下近似於中心畫素,pb包括了所有位置x處的畫素在閾值t下亮於中心畫素。

定義乙個新的布林變數kp,如果p是乙個角點,那些kp 為值,否則為假。

使用id3演算法(決策樹分類器)來查詢每乙個子集。

遞迴計算所有的子集直到kp的熵為0

被建立的決策樹就用於於其他的fast檢測

非極大值抑制

從鄰近的位置選取了多個特徵點是另乙個問題,我們可以使用non-maximal suppression來解決(本文的案例就是使用了非極大值抑制的方式,如果不使用,需要新增一下**)

fast.setnonmaxsuppression(0)

# 不使用非極大值抑制

kp = fast.detect(img,

none

)

實現的原理為每乙個檢測到的特徵點計算它的響應大小(score function)v。這裡v定義為點p和它周圍16個畫素點的絕對偏差的和。

考慮兩個相鄰的特徵點,並比較它們的v 值。

v值較低的點將會被刪除

OpenCV Shi Tomasi角點檢測演算法

shi tomasi運算元是1994年在文章 good features to track 中被提出的,opencv實現此演算法的函式就被命名為goodfeaturestotrack。shi tomasi運算元 cv mat basicalgorithm on shi tomasi cv mat m...

susan角點檢測演算法

susan演算法是1997年牛津大學的smith等人提出的一種處理灰度影象的方法,它主要是用來計算影象中的角點特徵。susan演算法選用圓形模板 如圖1所示 將位於圓形視窗模板中心等待檢測的畫素點稱為核心點。核心點的鄰域被劃分為兩個區域 亮度值相似於核心點亮度的區域即核值相似區 univalue s...

Shi Tomasi角點檢測演算法

1 shi tomasi概念 2 api 3 code 1 角點檢測除了harris角點檢測演算法外,還常常使用shi tomasi演算法,shi tomasi演算法是harris演算法的改進,因此計算速度更快,shi tomasi演算法於1994年在文章 good features to trac...