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代表邊的權值 ...