参考 FAST(features from accelerated segment test)特征提取算法
fast特征点是在像素级别上操作的,假设有一个候选点P,判断该定P是不是fast特征点的关键是,查看P点的四周的16个附近的点的灰度值是不是大于指定的阈值threshold =100,如果个数足够大(16个点中差值大于某个阈值的个数大于某个阈值,通常认为阈值为周长的四分之三),则认为该候选点位一个特征点。为了加快特征点的判断不必全部周围的16个都检查对比一边,而是选上下左右(1,5,9,16)4个点 至少有3个点中灰度值与候选点差值大于threshold,就可以认为该候选点P就是fast特征点
python版代码:
import numpy as np
import cv2
# 读入图片
img = cv2.imread('imges/football.png',0)
# 窗口
cv2.namedWindow('win',cv2.WINDOW_AUTOSIZE)
# cv2.namedWindow('win2',cv2.WINDOW_AUTOSIZE)
# 创建fast特征点检测器 threshold=150 候选点与四周灰度差值
fast = cv2.FastFeatureDetector_create(threshold=100,nonmaxSuppression=True,type=cv2.FAST_FEATURE_DETECTOR_TYPE_9_16)
# 开始检测, fast特征点检测到的坐标结果存放在kp
kp = fast.detect(img,None)#
# 绘制特征图
img = cv2.drawKeypoints(img,kp,img,color=(255,0,0))
cv2.imshow('win',img)
# cv2.imshow('win2',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果图:
C++版代码:
CMakeLists.txt文件
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 ) #设定最小版本号
PROJECT( fast_detect ) #设定工程名
#设定可执行二进制文件的目录
SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#设定存放编译出来的库文件的目录
SET( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#并且把该目录设为连接目录
LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib)
#设定头文件目录
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include)
#增加子文件夹,进行后续构建
ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src)
# 增加opencv的依赖
FIND_PACKAGE( OpenCV REQUIRED )
# 添加头文件
INCLUDE_DIRECTORIES( ${OpenCV_INCLUDE_DIRS} )
ADD_EXECUTABLE( fast_detect fast_detect.cpp )
TARGET_LINK_LIBRARIES( fast_detect ${OpenCV_LIBS} )
fast_detect.cpp
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main(int argc,char *argv[])
{
Mat image;
// 待检测图path
image = imread("imges/football.png");
// 存储为关键点
std::vector<KeyPoint> keyPoints;
// 定义特征检测
FastFeatureDetector fast(40); // 检测的阈值为40
// 特征点检测
fast.detect(image,keyPoints);
drawKeypoints(image, keyPoints, image, Scalar::all(255), DrawMatchesFlags::DRAW_OVER_OUTIMG);
imshow("FAST feature", image);
waitKey(0);
return 0;
}