理論
我們看到了一些特征檢測算法,他們很多都不錯卖漫,但是從實時應用的角度看捞魁,他們都不夠快,一個最好的例子是SLAM(同步定位與地圖創(chuàng)建)移動機器人沒有足夠的計算能力用含。
作為解決方案矮慕,F(xiàn)AST(加速切片測試特征)算法被提出,Edward Rosten和Tom Drummond 2006年在他們的論文“Machine learning for high-speed corner detection”提出啄骇,并在2010年最后修訂痴鳄,算法的基本大意如下:
使用FAST進行特征檢測
1.選擇一個圖像里的像素p用來識別是不是一個興趣點,它的強度是Ip
2.選擇一個合適的閾值t
3.在要測試的像素周圍找16個像素的圓
4.現(xiàn)在如果存在一個在圓內(nèi)(16像素的)的n個連續(xù)像素集合缸夹,他們都比Ip + t要亮痪寻,或者都比Ip - t 要暗(用白虛線顯示),那p就是角虽惭, n取12橡类。
5.用一個高速測試來排除大量非角。這個測試只檢查1,9,5和13位置的像素(首先1和9會測試是否他們太亮或者太暗芽唇,如果是顾画,再檢查5和13)。如果p是角,那么至少3個都比Ip+t要亮或者比Ip-t要暗亲雪,如果不是這樣勇凭,那么p不可能是角。這個檢測器展現(xiàn)了高性能义辕,但是有幾個缺陷:
·當n< 12時不能拒絕很多備選點
·像素的選擇不是可選的目派,因為它的效率依賴問題和角的分布墨吓。
·高速測試的結果被丟棄了
·會檢測出多個愛挨在一起的特征
機器學習角點檢測
1.選擇一組圖像進行訓練(最好從目標應用范圍內(nèi))
2.運行FAST算法來對每個圖像進行特征點查找
3.對每個特征點,存下周圍的16個像素作為向量。所有圖像做完以后得到特征向量P宇色。
4.這16個像素里的每個像素(設為x)可以有下面的三個狀態(tài):
5.根據(jù)這些狀態(tài)蹦漠,特征向量P被分成3個子集挑随,Pd, Ps, Pb.
6.定義個新的布爾變量Kp,如果p是角就是真反之為假侥猬。
7.使用ID3算法(決策樹分類)來查詢每個子集,對于每個true類用變量Kp撩幽,它選擇x來得出一個備選像素是否是角的信息库继。
8.對所有子集迭代直到為0
9.創(chuàng)建的決策樹用來對其他圖形做fast檢測
非極大值抑制
在臨近位置檢測多個興趣點是另一個問題,可以使用非極大值抑制來解決窜醉。
1.計算一個分數(shù)函數(shù)宪萄,V是所有檢測到的特征點,V是p和16個圍著的像素值得絕對差榨惰。
2.計算兩個相鄰關鍵點的V值
3.丟掉V值低的那個
總結:
它比其他存在的角點算法要快幾倍
但是它對高噪點情況來說不健壯拜英,依賴閾值
OpenCV里的FAST特征檢測
它和其他OpenCV里的特征檢測類似,如果你愿意琅催,你可以指定閾值居凶,是否使用非極大值抑制,要用的鄰居等藤抡。
對于鄰居侠碧,定義了三個標志位, cv2.FAST_FEATURE_DETECTOR_TYPE_5_8, cv2.FAST_FEATURE_DETECTOR_TYPE_7_12和cv2.FAST_FEATURE_DETECTOR_TYPE_9_16.
import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('simple.jpg',0)
# Initiate FAST object with default values
fast = cv2.FastFeatureDetector()# find and draw the keypoints
kp = fast.detect(img,None)
img2 = cv2.drawKeypoints(img, kp, color=(255,0,0))# Print all default params
print "Threshold: ", fast.getInt('threshold')
print "nonmaxSuppression: ", fast.getBool('nonmaxSuppression')
print "neighborhood: ", fast.getInt('type')
print "Total Keypoints with nonmaxSuppression: ", len(kp)cv2.imwrite('fast_true.png',img2)
# Disable nonmaxSuppression
fast.setBool('nonmaxSuppression',0)
kp = fast.detect(img,None)print "Total Keypoints without nonmaxSuppression: ", len(kp)
img3 = cv2.drawKeypoints(img, kp, color=(255,0,0))
cv2.imwrite('fast_false.png',img3)
看結果缠黍,第一個圖像顯示了使用了非極大值抑制的FAST舆床,第二個是沒有使用非極大值抑制的。
END