openCV - 角點檢測快速演算法 FAST
目標
在這個章節,
- 我們將理解FAST演算法的基本原理
- 並在openCV中使用FAST演算法的函式.
原理
我們看到了幾個特性檢測器,其中很多都非常好. 但是從實時應用的角度來看,它們還不夠快. 一個很好的例子:比如要在計算資源有限的移動機器人上應用SLAM技術 (即使定位和地圖構建技術) 將出現問題。一個解決方案就是採用FAST演算法,由Edward Rosten和Tom Drummond在他們2006年的論文《機器學習用於高速拐角檢測》中提出(後來在2010年進行了修訂)。演算法的基本總結如下。
使用 FAST來檢測特徵
- 選擇影像中的畫素 p 作為興趣點或不作為興趣點。讓它的強度 I p .
- 選擇合適的閾值 t .
- 圍繞測試中的畫素考慮一個由16個畫素組成的圓圈 (如下圖所示)
- 那麼畫素 p 是一個角點,如果圓圈中有一組相鄰的n個畫素(為16個畫素中的n個),它們的亮度都大於 Ip + t , 或者比 Ip − t 暗. (在上圖中白色虛線表示). n 為12.
- 提出了一種排除大量非轉角的高速試驗方法。這個測試只檢查1,9,5和13處的4個畫素(先測試1和9處的畫素看是否它們太亮或太暗,如果是,那麼再檢查5和13)。如果 p 是一個角,那麼其中至少三個點的亮度必須大於 Ip+t 或比 Ip - t 暗。如果這兩者都不是,那麼 p 就不能是角。然後透過對圓形中所有畫素的檢測,將全段測試準則應用到透過的候選物件上。該探測器本身表現出高效能,但有幾個弱點:
- 該演算法不會拒絕大量 n < 12 的候選點.
- 畫素的選擇不是最優的,因為它的效率取決於問題的排序和角的分佈。
- 快速測試的結果可能被丟棄。
- 多個特徵相鄰檢測。
前3點是用機器學習方法解決的。最後一個是使用非最大抑制。
機器學習角檢測器
- 選擇一組用於培訓的影像 (最好來自檢測目標範圍的影像)
- 對每一張影像運用 FAST 演算法找到特點.
- 對於每個特徵點,將其周圍的16個畫素儲存為一個向量。對所有的影像都這樣做,得到特徵向量 P 。
- 這16個畫素中的每個畫素(比如x)都可以有以下三種狀態之一:
5. 根據這些狀態,特徵向量 P 被細分為三個子集, Pd, Ps, Pb.
6. 定義一個新的布林變數 Kp ,如果 p 是一個角,則為真,否則為假。
7. 使用ID3演算法(決策樹分類器)查詢每個子集,使用變數 Kp 查詢關於真類。它選擇產生最多資訊量的x作為是否是角的候選,可以 透過計算 Kp 的熵來度量。
8. 遞迴地應用於所有子集,直到它的熵為零。
9. 所建立的決策樹用於其他影像的快速檢測。
非最大值抑制
在相鄰位置檢測多個興趣點是另一個問題。採用非最大抑制法求解。
- 計算一個分數函式,V代表所有檢測到的特徵點。V是p和周圍16個畫素值的絕對差值之和。
- 考慮兩個相鄰的關鍵點並計算它們的V值。
- Discard t丟棄V值較低的那個。
總結
它比其他現有的角探測器快幾倍。
但它對高噪點的影像效果並不好,依賴於閾值設定。
OpenCV中應用FAST
和其它特徵檢測器一樣。假如你想,你可以指定閾值,不管非最大值抑制用不用,鄰域都開啟。鄰域定義了3個標籤,cv.FAST_FEATURE_DETECTOR_TYPE_5_8, cv.FAST_FEATURE_DETECTOR_TYPE_7_12 and cv.FAST_FEATURE_DETECTOR_TYPE_9_16. 下面簡單的幾行程式碼展示如何使用FAST函式檢測和繪製特徵點。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('simple.jpg',0)
# Initiate FAST object with default values
fast = cv.FastFeatureDetector_create()
# find and draw the keypoints
kp = fast.detect(img,None)
img2 = cv.drawKeypoints(img, kp, None, color=(255,0,0))
# Print all default params
print( "Threshold: {}".format(fast.getThreshold()) )
print( "nonmaxSuppression:{}".format(fast.getNonmaxSuppression()) )
print( "neighborhood: {}".format(fast.getType()) )
print( "Total Keypoints with nonmaxSuppression: {}".format(len(kp)) )
cv.imwrite('fast_true.png',img2)
# Disable nonmaxSuppression
fast.setNonmaxSuppression(0)
kp = fast.detect(img,None)
print( "Total Keypoints without nonmaxSuppression: {}".format(len(kp)) )
img3 = cv.drawKeypoints(img, kp, None, color=(255,0,0))
cv.imwrite('fast_false.png',img3)
看結果,左邊和右邊分別顯示開啟和不開起非最大值抑制的效果:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2652297/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Fast角點檢測演算法AST演算法
- 【OpenCV】角點檢測:Harris角點及Shi-Tomasi角點檢測OpenCV
- OpenCV探索之路(十五):角點檢測OpenCV
- opencv-建立自己的角點檢測OpenCV
- OpenCV學習筆記-Harris角點檢測OpenCV筆記
- OpenCV計算機視覺學習(13)——影像特徵點檢測(Harris角點檢測,sift演算法)OpenCV計算機視覺特徵演算法
- Harris角點檢測
- opencv關鍵點檢測OpenCV
- 2.Harris角點檢測
- 【目標檢測】Fast R-CNN演算法實現ASTCNN演算法
- OpenCV檢測篇(一)——貓臉檢測OpenCV
- Shi-Tomas檢測和SHIF角點匹配
- 賈佳亞等提出Fast Point R-CNN,利用點雲快速高效檢測3D目標ASTCNN3D
- OpenCV成長之路(9):特徵點檢測與影象匹配OpenCV特徵
- PFLD:簡單、快速、超高精度人臉特徵點檢測演算法特徵演算法
- Python計算機視覺——Harris角點檢測Python計算機視覺
- 【火爐煉AI】機器學習048-Harris檢測影像角點AI機器學習
- opencv視訊人臉檢測OpenCV
- OpenCV 人臉檢測自學(3)OpenCV
- 異常點/離群點檢測演算法——LOF演算法
- 異常點檢測演算法小結演算法
- 目標檢測演算法盤點(最全)演算法
- [Computer Vision]Harris角點檢測的詳細推導
- opencv學習之邊緣檢測OpenCV
- Opencv 用SVM訓練檢測器OpenCV
- 【OpenCV教程】輪廓檢測過程OpenCV
- 物體檢測實戰:使用 OpenCV 進行 YOLO 物件檢測OpenCVYOLO物件
- Opencv中goodFeaturesToTrack函式(Harris角點、Shi-Tomasi角點檢測)運算元速度的進一步最佳化(1920*1080測試圖11ms處理完成)。OpenCVGoREST函式
- 人眼疲勞檢測之opencv人眼檢測xml說明OpenCVXML
- 視訊人臉檢測——OpenCV版(三)OpenCV
- 圖片人臉檢測——OpenCV版(二)OpenCV
- OpenCV2.4.4實現HOG行人檢測OpenCVHOG
- opencv——機器視覺檢測和計數OpenCV視覺
- python+opencv邊緣檢測方法整理PythonOpenCV
- Halcon缺陷檢測例項轉OpenCV實現(二) PCB印刷缺陷檢測OpenCV
- 影像區域性特徵點檢測演算法綜述特徵演算法
- fast_start_parallel_rollback引數的一點測試ASTParallel
- Halcon缺陷檢測例項轉OpenCV實現(三) 物體凸缺陷檢測OpenCV