溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

openCV中如何使用角點檢測快速算法FAST

發(fā)布時間:2021-12-29 18:09:39 來源:億速云 閱讀:654 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章主要為大家展示了“openCV中如何使用角點檢測快速算法FAST”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“openCV中如何使用角點檢測快速算法FAST”這篇文章吧。

原理

我們看到了幾個特性檢測器,其中很多都非常好. 但是從實時應(yīng)用的角度來看,它們還不夠快. 一個很好的例子:比如要在計算資源有限的移動機(jī)器人上應(yīng)用SLAM技術(shù) (即使定位和地圖構(gòu)建技術(shù)) 將出現(xiàn)問題。一個解決方案就是采用FAST算法。算法的基本總結(jié)如下。

使用 FAST來檢測特征

  1. 選擇圖像中的像素p作為興趣點或不作為興趣點。讓它的強(qiáng)度 I p.

  2. 選擇合適的閾值 t.

  3. 圍繞測試中的像素考慮一個由16個像素組成的圓圈 (如下圖所示)

openCV中如何使用角點檢測快速算法FAST

  1. 那么像素 p 是一個角點,如果圓圈中有一組相鄰的n個像素(為16個像素中的n個),它們的亮度都大于 Ip+t, 或者比 Ip?t 暗. (在上圖中白色虛線表示). n 為12.

  2. 提出了一種排除大量非轉(zhuǎn)角的高速試驗方法。這個測試只檢查1,9,5和13處的4個像素(先測試1和9處的像素看是否它們太亮或太暗,如果是,那么再檢查5和13)。如果p是一個角,那么其中至少三個點的亮度必須大于Ip+t 或比Ip - t 暗。如果這兩者都不是,那么 p 就不能是角。然后通過對圓形中所有像素的檢測,將全段測試準(zhǔn)則應(yīng)用到通過的候選對象上。該探測器本身表現(xiàn)出高性能,但有幾個弱點:

  • 該算法不會拒絕大量 n < 12 的候選點.

  • 像素的選擇不是最優(yōu)的,因為它的效率取決于問題的排序和角的分布。

  • 快速測試的結(jié)果可能被丟棄。

  • 多個特征相鄰檢測。

前3點是用機(jī)器學(xué)習(xí)方法解決的。最后一個是使用非最大抑制。

機(jī)器學(xué)習(xí)角檢測器

  1. 選擇一組用于培訓(xùn)的圖像 (最好來自檢測目標(biāo)范圍的圖像)

  2. 對每一張圖像運用 FAST 算法找到特點.

  3. 對于每個特征點,將其周圍的16個像素存儲為一個向量。對所有的圖像都這樣做,得到特征向量P。

  4. 這16個像素中的每個像素(比如x)都可以有以下三種狀態(tài)之一:

openCV中如何使用角點檢測快速算法FAST

5. 根據(jù)這些狀態(tài),特征向量P被細(xì)分為三個子集, Pd, Ps, Pb.

6. 定義一個新的布爾變量Kp,如果p是一個角,則為真,否則為假。

7. 使用ID3算法(決策樹分類器)查詢每個子集,使用變量Kp查詢關(guān)于真類。它選擇產(chǎn)生最多信息量的x作為是否是角的候選,可以 通過計算Kp的熵來度量。

8. 遞歸地應(yīng)用于所有子集,直到它的熵為零。

9. 所建立的決策樹用于其他圖像的快速檢測。

非最大值抑制

在相鄰位置檢測多個興趣點是另一個問題。采用非最大抑制法求解。

  1. 計算一個分?jǐn)?shù)函數(shù),V代表所有檢測到的特征點。V是p和周圍16個像素值的絕對差值之和。

  2. 考慮兩個相鄰的關(guān)鍵點并計算它們的V值。

  3. Discard t丟棄V值較低的那個。

總結(jié)

它比其他現(xiàn)有的角探測器快幾倍。

但它對高噪點的圖像效果并不好,依賴于閾值設(shè)定。

OpenCV中應(yīng)用FAST

和其它特征檢測器一樣。假如你想,你可以指定閾值,不管非最大值抑制用不用,鄰域都開啟。鄰域定義了3個標(biāo)簽,cv.FAST_FEATURE_DETECTOR_TYPE_5_8, cv.FAST_FEATURE_DETECTOR_TYPE_7_12 and cv.FAST_FEATURE_DETECTOR_TYPE_9_16. 下面簡單的幾行代碼展示如何使用FAST函數(shù)檢測和繪制特征點。

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)

看結(jié)果,左邊和右邊分別顯示開啟和不開起非最大值抑制的效果:

openCV中如何使用角點檢測快速算法FAST

以上是“openCV中如何使用角點檢測快速算法FAST”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI