FAST演算法學習

2021-07-31 21:41:59 字數 2476 閱讀 2711

fast 全稱 features from accelerated segment test,一種用於角點檢測的演算法,該演算法的原理是取影象中檢測點,以該點為圓心的周圍的16個畫素點判斷檢測點是否為角點。通俗的講就是中心的的畫素值比大部分周圍的畫素值要亮乙個閾值 或者 暗乙個閾值則為角點。

對於檢測點p,若周圍的16個畫素點中有n個連續的點的畫素值都比其小乙個閾值 或 大 乙個閾值,則該點可作為角點。

即img[x] < img[p] - threshold 或  

img[x] > img[p] + 

threshold,

threshold為閾值,img[x]為任意連續的10個畫素點值,img[p]為中心畫素點值。

該步驟用於篩選出合適的角點,比如在人臉檢測的時候測出有三個視窗的人臉,但要確定乙個最合適的視窗就需要進行非極大值抑制。

(1)根據得分函式求得每個角點得分

得分函式的規則為:周圍16個點中最大的  連續10個點的絕對值差的最小值,且滿足x>threshold的值即為得分。

(2)在3x3的區域中比較得分,選取分值最大的那個點。

上opencv的fast實現(cv_sse2已捨去)

void fast_t(inputarray _img, std::vector& keypoints, int threshold, bool nonmax_suppression)

}else

count = 0;}}

if (d & 2)

}else

count = 0;}}

}} cornerpos[-1] = ncorners;

/*這裡重點說一下為什麼是i==3的時候跳過,因為進行非極大值抑制的時候是對prev行進行操作的,這樣操作可實現非極大值抑制也是從第三行開始*/

if (i == 3)

continue;

const uchar* prev = buf[(i - 4 + 3) % 3];

const uchar* pprev = buf[(i - 5 + 3) % 3];

cornerpos = cpbuf[(i - 4 + 3) % 3];

ncorners = cornerpos[-1];

/*假設當前行為第 i 行 curr,

對應第i-1行prev,

第i-2行pprev

此時cornerpos記錄的是第i-1行prev的角點位置資訊,

最後求出的的非極大值抑制是相對於第i-1行prev的,

因為要3x3的區域中進行,只有下一行求出後才可進行當前行的計算。

*/for (k = 0; k < ncorners; k++)}}}

求實際影象的周圍畫素點的相對位置:

void makeoffsets(int pixel[25], int rowstride, int patternsize)

, , , , , , , ,

, , , , , , ,

};static const int offsets12[2] =

, , , , , ,

, , , , ,

};static const int offsets8[2] =

, , , ,

, , ,

};const int (*offsets)[2] = patternsize == 16 ? offsets16 :

patternsize == 12 ? offsets12 :

patternsize == 8 ? offsets8 : 0;

cv_assert(pixel && offsets);

int k = 0;

for( ; k < patternsize; k++ )

pixel[k] = offsets[k][0] + offsets[k][1] * rowstride;

for( ; k < 25; k++ )

pixel[k] = pixel[k - patternsize];

}

求得分函式:

template<>

int cornerscore<16>(const uchar* ptr, const int pixel, int threshold)

//對應img[x] < img[p] - threshold

int b0 = -a0;

for (k = 0; k < 16; k += 2)

threshold = -b0 - 1;

return threshold;

}

在**實現中,對角點的檢測 以及得分函式的實現寫法值得一看。

如果不想用opencv原生庫的話,可以自己實現cornerscore 以及 makeoffsets函式,

特徵點檢測學習 4 FAST演算法

fast特徵點檢測演算法 在眾多特徵點檢測演算法中,fast演算法的優勢是速度快,主要利用周圍畫素比較的資訊就可以得到特徵,簡單有效。fast演算法是基於角點檢測的影象特徵,其定義特徵點的依據是 如果某個畫素點和他周圍鄰域足夠多的畫素點處於不同區域,則這個畫素點就是特徵點,對於灰度圖來說,也就是該點...

演算法學習 Union Find演算法

union find演算法有它的實際用途。多用於動態連通的應用場景。union find演算法是 給出兩個節點,判斷它們是否連通,如果連通,是不需要給出具體的路徑的 舉兩個例子作為主要表現 1 在網路連線中,當發現沒有連線的兩個節點,可以把他們連線起來,一旦節點都連線起來,又能把多餘的線拆除,這時候...

演算法學習 KM演算法

km演算法 用於求二分圖的最佳完美匹配 即權值最大的完美匹配 如果你也是個剛來學習km演算法的人 大概的用途肯定還是知道的吧 還是直接說重點吧 首先 理解km演算法前 必須有以下3個概念 1.可行頂標 對於乙個賦值二分圖g x,y,e,w x,y 代表二分圖的兩邊頂點標號 e代表邊 w代表邊的權值 ...