##特征點檢測之FAST算法
在上一節中,記錄了Harris算子檢測圖像特征點的定義和基于OpenCV的實現方法,它基于兩個正交方向上的強度變化率。本節記錄另一種特征點檢測算子FAST(Features from Accelerated Segment Test),它依賴少數像素的比較來確定是否接受一個特征點,其檢測效率要好于Harris。
與Harris算法相同,FAST特征算法需要定義什么是特征點。這次的定義基于假定特征點周圍的圖像強度,通過檢查候選像素的周圍一圈像素來決定是否接受這一個特征點。與中心點差異較大的像素如果組成連續的圓弧,并且弧長大于圓周長的3/4,則可判斷為特征點。
在此基礎上,算法還使用了額外的技巧進行加速。首先測試一個圓圈上被90度分隔的四個點(如頂部、底部,左側和右側四個點),如果要滿足FAST的定義條件,四個點中至少要有三個點必須同時大于或小于中心像素。如果條件不成立,則該點可以直接被移除而不需要進一步的驗證。在實踐中,大部分的像素點可以通過這個測試進行移除,因此該算法非常高效。
和Harris方法相同的是,可以在找到的角點上執行非極大值抑制,因此需要指定角點強度的測量方法。
這里可以使用OpenCV 2的通用接口來創建任意的特征檢測器,比如FAST檢測器的使用方法如下:
~~~
// 創建特征點的向量
std::vector<cv::KeyPoint>keypoints;
// 構造FAST特征檢測器
cv::FastFeatureDetector fast(75);
// 進行檢測
fast.detect(image, keypoints);
~~~
同時,為了方便標記特征點,OpenCV提供了通用的特征點繪制函數cv::drawKeypoints,其調用方法如下:
~~~
// 通用的特征點繪制函數
cv::drawKeypoints(image, // 輸入圖像
keypoints, // 特征點向量
image, // 輸出圖像
cv::Scalar(255,255,255), // 特征點顏色
cv::DrawMatchesFlags::DRAW_OVER_OUTIMG); // 繪制標記
~~~
通過指定選中的繪制標記,可以看到輸出圖像中特征點均得到了繪制:

完整的實現代碼如下,只需修改main函數:
~~~
#include <QCoreApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d/features2d.hpp>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 輸入圖像
cv::Mat image = cv::imread("c:/031.jpg", 0);
cv::namedWindow("Original Image");
cv::imshow("Original Image", image);
// 特征點的向量
std::vector<cv::KeyPoint>keypoints;
// 構造FAST特征檢測器
cv::FastFeatureDetector fast(75);
// 進行檢測
fast.detect(image, keypoints);
// 通用的特征點繪制函數
cv::drawKeypoints(image, // 輸入圖像
keypoints, // 特征點向量
image, // 輸出圖像
cv::Scalar(255, 255, 255), // 特征點顏色
cv::DrawMatchesFlags::DRAW_OVER_OUTIMG); // 繪制標記
cv::namedWindow("Fast Feature");
cv::imshow("Fast Feature", image);
return a.exec();
}
~~~
FAST算法可以獲得非常快速的特征點檢測,在需要考慮運行速度的時候可以選用,比如在高幀率的視頻序列中進行視覺跟蹤。
關于FAST特征算法的詳細描述,可參考以下論文:
The article by E.Rosten, T.Drummond, Machine Learning for High-speed Corner Detection, In European Conference on Computer Vision, pp.430-443, 2006
- 前言
- Win8.1下OpenCV2.4.9+Qt5.3.2開發環境搭建
- OpenCV2學習筆記(一)
- OpenCV2學習筆記(二)
- OpenCV2學習筆記(三)
- OpenCV2學習筆記(四)
- OpenCV2學習筆記(五)
- OpenCV2學習筆記(六)
- OpenCV2學習筆記(七)
- OpenCV2學習筆記(八)
- OpenCV2學習筆記(九)
- OpenCV2學習筆記(十)
- OpenCV2學習筆記(十一)
- OpenCV2學習筆記(十二)
- OpenCV2學習筆記(十三)
- OpenCV2學習筆記(十四)
- OpenCV2學習筆記(十五)
- OpenCV2學習筆記(十六)
- OpenCV2學習筆記(十七)
- OpenCV2學習筆記(十八)
- OpenCV2學習筆記(十九)
- OpenCV2學習筆記(二十)
- OpenCV2學習筆記(二十一)
- OpenCV2學習筆記(二十二)