OpenCv學習筆記12 FAST角點檢測

2021-09-01 15:30:45 字數 3326 閱讀 9839

在前面我們已經陸續介紹了許多特徵檢測運算元,我們可以根據影象區域性的自相關函式求得harris角點,後面又提到了兩種十分優秀的特徵點以及他們的描述方法sift特徵和surf特徵。surf特徵是為了提高運算效率對sift特徵的一種近似,雖然在有些實驗環境中已經達到了實時,但是我們實踐工程應用中,特徵點的提取與匹配只是整個應用演算法中的一部分,所以我們對於特徵點的提取必須有更高的要求,從這一點來看前面介紹的的那些特徵點方法都不可取。

為了解決這個問題,edward rosten和tom drummond在2023年發表的「machine learning for high-speed corner detection」文章中提出了一種fast特徵,並在2023年對這篇**作了小幅度的修改後重新發表。fast的全稱為features from accelerated segment test。

rosten等人將fast角點定義為:若某畫素點與其周圍領域內足夠多的畫素點處於不同的區域,則該畫素點可能為角點。也就是某些屬性與眾不同,考慮灰度影象,即若該點的灰度值比其周圍領域內足夠多的畫素點的灰度值大或者小,則該點可能為角點。

從中選取乙個畫素pp,下面我們將判斷它是不是乙個特徵點。我們首先把它的亮度值設為ipip;

設定乙個合適的閾值tt;

考慮以該畫素點為中心的乙個半徑等於3畫素的離散化的bresenham圓,這個圓的邊界上有16個畫素;

4.現在,如果在這個大小為16個畫素的圓上有nn個連續的畫素點,他們的畫素值要麼都比ip+tip+t大,要麼都比ip−tip−t小,那麼他就是乙個角點。nn的值可以設定為12或者9,實驗證明選擇9可能會有更好的效果。

上面的演算法中,對於影象中的每乙個點,我們都要去遍歷其鄰域圓上的16個點的畫素,效率較低。我們下面提出了一種高效的測試(high-speed test)來快速排除一大部分非角點的畫素。該方法僅僅檢查在位置1,9,5和13四個位置的畫素,首先檢測位置1和位置9,如果它們都比閾值暗或比閾值亮,再檢測位置5和位置13。如果pp是乙個角點,那麼上述四個畫素點中至少有3個應該必須都大於ip+tip+t或者小於ip−tip−t,因為若是乙個角點,超過四分之三圓的部分應該滿足判斷條件。如果不滿足,那麼pp不可能是乙個角點。對於所有點做上面這一部分初步的檢測後,符合條件的將成為候選的角點,我們再對候選的角點,做完整的測試,即檢測圓上的所有點。

上面的演算法效率實際上是很高的,但是有點一些缺點:

fast角點檢測

'''import cv2

'''1、載入'''

'''2、提取特徵點'''

#建立乙個fast物件,傳入閾值t 可以處理rgb色彩空間影象

fast = cv2.fastfeaturedetector_create(threshold=50)

keypoints1 = fast.detect(image1,none)

#在影象上繪製關鍵點

image1 = cv2.drawkeypoints(image=image1,keypoints = keypoints1,outimage=image1,color=(255,0,255),flags=cv2.draw_matches_flags_draw_rich_keypoints)

#輸出預設引數

print("threshold: ", fast.getthreshold())

print("nonmaxsuppression: ", fast.getnonmaxsuppression())

print("neighborhood: ", fast.gettype())

print("total keypoints with nonmaxsuppression: ", len(keypoints1))

#顯示影象

cv2.imshow('fast_keypoints1',image1)

cv2.waitkey(20)

#關閉非極大值抑制

fast.setnonmaxsuppression(0)

keypoints1 = fast.detect(image1,none)

print("total keypoints without nonmaxsuppression: ", len(keypoints1))

image1 = cv2.drawkeypoints(image=image1,keypoints = keypoints1,outimage=image1,color=(255,0,255),flags=cv2.draw_matches_flags_draw_rich_keypoints)

cv2.imshow('fast_keypoints1 nms',image1)

cv2.waitkey(0)

cv2.destroyallwindows()

執行結果如下: 

可以看到經過非極大值抑制之後,特徵點從2762個降低到了411個。如果你修改閾值t,你會發現tt越大,檢測到的特徵點越小。

如果你還記得我們之前介紹sift特徵和surf特徵,我們忽略演算法引數的影響,從總體上來看,你會發現fast的特徵點數量遠遠多於前著。這是受多方面元素影響,一方面是受演算法本身影響,這兩個演算法是完全不同的;另一方面fast特徵對雜訊比較敏感,從上我們也可以觀察到,比如廣場上許多的的雜訊點。

除了上面我所說的這些,fast演算法還有以下需要改進的地方:

後面我會介紹orb演算法,orb將基於fast關鍵點檢測的技術和基於brife描述符的技術相結合,orb演算法解決了上面我所講述到的缺點,可以用來替代sift和surf演算法,與兩者相比,orb擁有更快的速度。

Opencv2系列學習筆記12 檢測fast特徵

一 fast特徵定義什麼是角點 這次的定義基於假定特徵點周圍的影象強度,通過檢查候選畫素周圍一圈畫素來決定是否接受乙個特徵點。與中心點差異較大的畫素如果組成連續的圓弧,並且弧長大於原周長的 3 4,那麼我們認為找到了乙個特徵點。二 加速技巧 首先測試圓上被90度分割的四個點 頂部,底部,左側及右側 ...

OpenCV學習筆記12 形態學轉換

形態學操作 根據影象形狀進行的簡單操作。原理 卷積核沿著影象滑動,如果與卷積核對應的原影象的所有畫素值都是 1,那麼中心元素就保持原來的畫素值,否則就變為零。效果 前景物體會變小,整幅影象的白色區域會減少。用途 去除白雜訊 斷開兩個連在一塊的物體等。cv2.erode src,kernel dst ...

《Open CV3程式設計入門》學習筆記12

標準霍夫變換 針對影象中非零畫素點,通過在極座標下對極徑極角平面繪出所有通過該點的直線,將得到一條正弦曲線。然後對影象中所有非零點進行上述操作,得到所有正弦曲線並繪製在同一平面內,越多曲線交於一點,說明該點 所代表的直線交於影象中的更多的非零點,當這些曲線數超過設定的閾值時,即認為檢測到了一條直線。...