在這一章當中,html
咱們看到了幾個特徵探測器,其中不少都很是棒。但從實時應用角度來看,它們速度不夠快。一個最好的例子是SLAM(同時定位和映射)移動機器人,其計算資源有限。python
做爲一種解決方案,Edward Rosten和Tom Drummond在2006年的論文「用於高速角點檢測的機器學習」(稍後在2010年對其進行了修訂)中提出了FAST(來自加速段測試的特徵)算法。下面介紹該算法的基本概述。有關更多詳細信息,請參閱原稿紙張(全部圖像均取自原始紙張)。算法
選擇要識別爲興趣點的圖像中的像素。讓它的強度成爲。機器學習
選擇適當的閾值。函數
考慮圍繞被測像素的16個像素的圓圈。(見下圖)性能
如今像素是一個角落,若是在圓圈(16像素)中存在一組連續的像素,這些像素比這些都亮或比它們都暗。(在上圖中顯示爲白色虛線)。被選爲12。學習
甲高速測試被建議將排除了大量的非角部。這個測試只檢測1個,9個,5個和13個四個像素(首先測試1和9是否太亮或太暗,若是是,則檢查5和13)。若是是一個角落,那麼至少有三個必須比這個更亮或比它更暗。若是這兩種狀況都不是這樣,那麼就不能成爲一個角落。而後能夠經過檢查圓中的全部像素,將所有分段測試標準應用於經過的候選。這種探測器自己表現出高性能,但有幾個缺點:測試
- 它不會拒絕n <12的候選人。
- 像素的選擇不是最優的,由於它的效率取決於問題的排序和角落外觀的分佈。
- 高速測試的結果被拋棄。
- 多個特徵被檢測爲彼此相鄰。
機器學習方法解決了前3個問題。最後一個是使用非最大抑制來解決的。spa
選擇一組用於訓練的圖像(最好來自目標應用程序域)code
在每一個圖像中運行FAST算法以查找特徵點。
對於每一個特徵點,將它周圍的16個像素存儲爲一個向量。爲全部圖像作特徵向量。
這16個像素中的每一個像素(好比說)能夠具備如下三種狀態之一:
根據這些狀態,特徵向量被分爲3個子集,,,。
定義一個新的布爾變量,若是是一個角,則爲true,不然爲false。
使用ID3算法(決策樹分類器)使用該變量查詢每一個子集以得到關於真實類的知識。它選擇哪一個產生關於候選像素是不是一個角的最多信息,用熵來衡量。
這是遞歸應用於全部的子集,直到它的熵爲零。
如此建立的決策樹用於其餘圖像中的快速檢測。
在相鄰位置檢測多個興趣點是另外一個問題。它經過使用非最大抑制來解決。
它比其餘現有的角落探測器快幾倍。
可是它對高噪聲水平並不穩健。它取決於一個門檻。
它在OpenCV中被稱爲任何其餘特徵檢測器。若是您願意,您能夠指定閾值,是否應用非最大抑制,要使用的鄰域等。
對於鄰域,定義了三個標誌cv2.FAST_FEATURE_DETECTOR_TYPE_5_8
,cv2.FAST_FEATURE_DETECTOR_TYPE_7_12
和cv2.FAST_FEATURE_DETECTOR_TYPE_9_16
。如下是關於如何檢測和繪製FAST特徵點的簡單代碼。
import numpy as np import cv2 from matplotlib import pyplot as plt img = 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)
查看結果。第一張圖片顯示了使用nonmaxSuppression的FAST和沒有nonmaxSuppression的第二張圖片:
參考:
http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_fast/py_fast.html
轉載請註明出處!!!