FAST角点检测算法

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个满足条件。

FAST角点检测算法_第1张图片

  • 以上算法的缺点:很可能大部分检测出来的点彼此之间相邻,我们要去除一部分这样的点。为了解决这一问题,我们采用了非极大值抑制的算法

  • 非极大值抑制
    对一个角点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   //该行为Qt环境使用。VS下请注释或删除该行。
#include 

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 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;
}

原图:
FAST角点检测算法_第2张图片
效果图:
FAST角点检测算法_第3张图片

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)

原图:
FAST角点检测算法_第4张图片
效果图:
FAST角点检测算法_第5张图片

  • cv2.FeatureDetector_create(detector type)

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

  • 相关资料
  • FAST角点检测算法(二)- 非极大值抑制筛选fast特征点

  • Harris角点检测(Python-OpenCV)

  • 机器学习、深度学习、计算机视觉、自然语言处理及应用案例——干货分享(持续更新……)

你可能感兴趣的:(Python,OpenCV--Python,计算机视觉,opencv,C++)