FAST角点检测算法
author@Jason_ql(lql0716)
http://blog.csdn.net/lql0716
1、FAST角点检测原理
- 算法步骤:
1、在图像中任选一点p, 假定其像素(亮度)值为 Ip
2、以3为半径画圆,覆盖p点周围的16个像素,如下图所示
3、设定阈值t,如果这周围的16个像素中有连续的n个像素的像素值都小于 Ip−t或者有连续的n个像素都大于Ip+t, 那么这个点就被判断为角点。 在OpenCV的实现中n取值为12(16个像素周长的 3/4).
4、一种更加快的改进是: 首先检测p点周围的四个点,即1, 5, 9, 12四个点中是否有三个点满足超过Ip+t, 如果不满足,则直接跳过,如果满足,则继续使用前面的算法,全部判断16个点中是否有12个满足条件。
以上算法的缺点:很可能大部分检测出来的点彼此之间相邻,我们要去除一部分这样的点。为了解决这一问题,我们采用了非极大值抑制的算法
非极大值抑制
对一个角点P建立一个3*3(或5*5,7*7)的窗口,如果该窗口内出现了另一个角点Q,则比较P与Q的大小,如果P大,则将Q点删除,如果P小,则将P点删除。FAST 算法特点
1、在速度上要比其他算法速度快很多
2、受图像噪声以及设定的阈值影响很大
3、FAST不产生多尺度特征而且FAST特征点没有方向信息,这样就会失去旋转不变性。
2、opencv-Fast角点检测算法C++版代码
- C++代码(opencv2.4.13)
#include <QCoreApplication> //该行为Qt环境使用。VS下请注释或删除该行。
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
//**********************************************************************************************
// 【fast角点检测算法】
//**********************************************************************************************
int main()
{
string path = "/home/jason/1.jpg"; //图片路径
cv::Mat img, gray;
img = cv::imread(path); //读取图片
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); //转换为灰度图
std::vector<KeyPoint> kp; //特征点向量
cv::FastFeatureDetector fast(32); //FAST特征检测器, 32为阈值,阈值越大,特征点越少
fast.detect(gray, kp); //检测fast特征点
cv::drawKeypoints(img, kp, img, cv::Scalar(0, 255, 0), cv::DrawMatchesFlags::DRAW_OVER_OUTIMG); //画特征点
cv::namedWindow("img", cv::WINDOW_NORMAL);
cv::imshow("img", img);
cv::waitKey(0);
cv::imwrite("/home/jason/1.jpg", img);
return 0;
}
原图:
效果图:
3、opencv-Fast角点检测算法python版代码
- python版代码(opencv2.4.13)
该代码和C++代码略有不同,且未设置阈值,故角点可能不太一致。
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 13 21:06:59 2017
@author: lql0716
"""
import cv2
img = cv2.imread('D:/photo/01.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
fast = cv2.FeatureDetector_create('FAST')
kp = fast.detect(gray, None)
img2 = cv2.drawKeypoints(img, kp, (0, 0, 255))
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.imshow('img', img2)
cv2.imwrite('D:/photo/01_1.jpg', img2)
cv2.waitKey(0)
原图:
效果图:
python调用以下算法时,调用方法同上面FAST的调用方法相同。
Parameters:
detectorType – Feature detector type.
The following detector types are supported:
“FAST” – FastFeatureDetector
“STAR” – StarFeatureDetector
“SIFT” – SIFT (nonfree module)
“SURF” – SURF (nonfree module)
“ORB” – ORB
“BRISK” – BRISK
“MSER” – MSER
“GFTT” – GoodFeaturesToTrackDetector
“HARRIS” – GoodFeaturesToTrackDetector with Harris detector enabled
“Dense” – DenseFeatureDetector
“SimpleBlob” – SimpleBlobDetector
- 相关资料