這兩個 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: 會選擇質量高且穩定的特徵點,更適合後續的特徵追蹤和匹配任務,會對角點進行篩選,選擇較少但質量較高的角點。
