這兩個 OpenCV 的函數 FAST
和 goodFeaturesToTrack
都是用於特徵點檢測的,但它們有不同的用途和工作原理。以下是它們的區別:
1. FAST
函數
目的 : FAST
是用來檢測圖像中的角點(KeyPoints),特別是高效的角點檢測器(Feature Detector)。它通常用於實時應用中,能夠快速地找到圖像中的角點。
參數:
InputArray image
: 輸入圖像,必須是灰度圖像。CV_OUT std::vector<KeyPoint>& keypoints
: 輸出檢測到的特徵點(角點)。threshold
: 用來判斷是否為角點的閾值。該值越高,檢測到的角點數量越少,通常需要調整來達到最佳效果。nonmaxSuppression
: 是否執行非極大值抑制來過濾非最大角點。如果設置為true
,將只保留局部最大值的角點,這樣可以避免過多的角點。
特點:
- 用途: 主要用來檢測快速角點(FAST角點檢測算法),適合用於需要快速計算的場合。
- 算法: FAST 是一種基於亮度變化的角點檢測算法,會在每個像素周圍檢查圓形範圍的亮度變化來確定是否是角點。它主要檢測圖像中的角點,通常不會產生過多的特徵點,並且計算速度較快。
- 應用場景: 用於需要快速檢測角點的場景,像是視覺跟踪、視覺SLAM等。
2. goodFeaturesToTrack
函數
目的 : goodFeaturesToTrack
是用來檢測圖像中具有較高質量的特徵點,通常是角點(也叫做"強特徵點")。該算法會選擇出圖像中比較穩定且容易追蹤的特徵點,並且會根據質量值進行過濾。
參數:
InputArray image
: 輸入圖像,必須是灰度圖像。OutputArray corners
: 輸出特徵點的座標。int maxCorners
: 最大角點數量,該值控制返回的角點數量,會返回最強的maxCorners
個角點。double qualityLevel
: 角點質量的閾值,用來控制選擇的角點質量。質量高的角點將會被選中。double minDistance
: 相鄰角點之間的最小距離,這有助於防止返回過於接近的角點。InputArray mask
: 掩膜圖像,可以限制角點檢測範圍。int blockSize
: 用來計算每個像素的角點質量的區域大小。int gradientSize
: 用來計算角點的梯度大小,預設為 3。bool useHarrisDetector
: 是否使用 Harris 角點檢測算法來計算角點的質量。若為false
,則使用 Shi-Tomasi 方法。double k
: Harris 算法中的常數k
,當useHarrisDetector=true
時有效。
特點:
- 用途: 用來檢測圖像中的強角點,並選擇出穩定且具有較高質量的角點。這些特徵點通常具有較高的區分度和可追蹤性。
- 算法 :
goodFeaturesToTrack
使用 Shi-Tomasi 角點檢測算法(或可選的 Harris 算法)來選擇高質量的角點。該算法選擇質量較高的角點,並根據角點之間的最小距離過濾掉重疊的角點。 - 應用場景 : 用於光流法(如
calcOpticalFlowPyrLK
)、特徵匹配等需要穩定、易於追蹤的角點的應用。
主要區別
-
檢測角點的質量:
FAST
主要用來快速檢測角點,沒有直接考慮角點的質量。它適用於需要快速檢測的情況。goodFeaturesToTrack
會根據角點的質量選擇特徵點,能夠選擇出最具區分度的角點,通常更適合用於後續的追蹤或匹配任務。
-
角點的數量和篩選:
FAST
可以檢測圖像中所有的角點,但這些角點不一定是最強的,可能會有很多冗餘點。通過nonmaxSuppression
可以過濾掉部分冗餘的角點。goodFeaturesToTrack
設置了maxCorners
和qualityLevel
等參數,會挑選出質量較高的角點,並且在距離上進行篩選,防止過多重疊的角點。
-
運行速度:
FAST
通常比goodFeaturesToTrack
更快,因為它的算法本身設計上是為了速度優化的。
-
應用場景:
FAST
常用於即時處理和對速度要求高的場合(如視覺SLAM、即時物體追蹤等)。goodFeaturesToTrack
更適合於需要精確選擇高質量特徵點的場景(如光流估計、視覺匹配等)。
總結
- FAST: 速度快,適用於即時處理,對質量要求不高,更多的是快速檢測角點。
- goodFeaturesToTrack: 會選擇質量高且穩定的特徵點,更適合後續的特徵追蹤和匹配任務,會對角點進行篩選,選擇較少但質量較高的角點。