特徵檢測(三):OpenCV中的拐角檢測的FAST算法

目標

在這一章當中,html

  • 咱們將瞭解FAST算法的基礎知識
  • 咱們將使用OpenCV功能爲FAST算法找到角點。

理論

咱們看到了幾個特徵探測器,其中不少都很是棒。但從實時應用角度來看,它們速度不夠快。一個最好的例子是SLAM(同時定位和映射)移動機器人,其計算資源有限。python

做爲一種解決方案,Edward Rosten和Tom Drummond在2006年的論文「用於高速角點檢測的機器學習」(稍後在2010年對其進行了修訂)中提出了FAST(來自加速段測試的特徵)算法。下面介紹該算法的基本概述。有關更多詳細信息,請參閱原稿紙張(全部圖像均取自原始紙張)。算法

使用FAST進行功能檢測

  1. 選擇p要識別爲興趣點的圖像中的像素。讓它的強度成爲I_P機器學習

  2. 選擇適當的閾值Ť函數

  3. 考慮圍繞被測像素的16個像素的圓圈。(見下圖)性能

    圖像中的一個角落

  4. 如今像素p是一個角落,若是ñ在圓圈(16像素)中存在一組連續的像素,這些像素比這些都亮I_p + t或比它們都暗I_p  -  t。(在上圖中顯示爲白色虛線)。ñ被選爲12。學習

  5. 高速測試被建議將排除了大量的非角部。這個測試只檢測1個,9個,5個和13個四個像素(首先測試1和9是否太亮或太暗,若是是,則檢查5和13)。若是p是一個角落,那麼至少有三個必須比這個更亮I_p + t或比它更暗I_p  -  t。若是這兩種狀況都不是這樣,那麼p就不能成爲一個角落。而後能夠經過檢查圓中的全部像素,將所有分段測試標準應用於經過的候選。這種探測器自己表現出高性能,但有幾個缺點:測試

    • 它不會拒絕n <12的候選人。
    • 像素的選擇不是最優的,由於它的效率取決於問題的排序和角落外觀的分佈。
    • 高速測試的結果被拋棄。
    • 多個特徵被檢測爲彼此相鄰。

機器學習方法解決了前3個問題。最後一個是使用非最大抑制來解決的。spa

機器學習角檢測器

  1. 選擇一組用於訓練的圖像(最好來自目標應用程序域)code

  2. 在每一個圖像中運行FAST算法以查找特徵點。

  3. 對於每一個特徵點,將它周圍的16個像素存儲爲一個向量。爲全部圖像作特徵向量P

  4. X這16個像素中的每一個像素(好比說)能夠具備如下三種狀態之一:

    FAST等式

  5. 根據這些狀態,特徵向量P被分爲3個子集,P_DP_SP_B

  6. 定義一個新的布爾變量,K_p若是p是一個角,則爲true,不然爲false。

  7. 使用ID3算法(決策樹分類器)使用該變量查詢每一個子集以得到K_p關於真實類的知識。它選擇X哪一個產生關於候選像素是不是一個角的最多信息,用熵來衡量K_p

  8. 這是遞歸應用於全部的子集,直到它的熵爲零。

  9. 如此建立的決策樹用於其餘圖像中的快速檢測。

非最大抑制

在相鄰位置檢測多個興趣點是另外一個問題。它經過使用非最大抑制來解決。

  1. 計算V全部檢測到的特徵點的得分函數。Vp周圍像素值和16個周圍像素值之間的絕對差值的總和。
  2. 考慮兩個相鄰的關鍵點並計算它們的V值。
  3. 丟棄V值較低的那個。

摘要

它比其餘現有的角落探測器快幾倍。

可是它對高噪聲水平並不穩健。它取決於一個門檻。

OpenCV中的FAST特徵檢測器

它在OpenCV中被稱爲任何其餘特徵檢測器。若是您願意,您能夠指定閾值,是否應用非最大抑制,要使用的鄰域等。

對於鄰域,定義了三個標誌cv2.FAST_FEATURE_DETECTOR_TYPE_5_8cv2.FAST_FEATURE_DETECTOR_TYPE_7_12cv2.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的第二張圖片:

快速關鍵點

其餘資源

  1. Edward Rosten和Tom Drummond在第九屆歐洲計算機視覺會議上的「用於高速角部檢測的機器學習」 1,2006年,第430-443頁。
  2. Edward Rosten,Reid Porter和Tom Drummond在IEEE Trans。上發表的「更快更好:一種機
  3. 器學習角點檢測方法」。Pattern Analysis and Machine Intelligence,2010,第32卷,第105-119頁。

參考:

http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_fast/py_fast.html

轉載請註明出處!!!

相關文章
相關標籤/搜索