如果在这个大小为16个像素的圆上有n个连续的像素点,它们的像素值要么都比Ip+t大,要么都比Ip−t小,那么它就是一个角点。(如图1中的白色虚线所示)。n的值可以设置为12或者9,实验证明选择9可能会有更好的效果。
FAST算子是通过邻域像素的比对来检测特征点,所以没有多尺度的问题。
void FASTX(InputArray image, vector& keypoints, int threshold, bool nonmaxSuppression=true, int type)
image 是输入的图像,
keypoints 是返回的特征点,
threshold 是定义的阈值,
第四个决定是否使用非极大值抑制。
1、
#include
using namespace cv;
int main()
{
Mat img = imread("house.png");
//Keypoint类型
std::vector keypoints;
//调用FAST函数
FAST(img, keypoints, 20);
Mat img_keypoints;
//drawKeypoints函数
drawKeypoints(img, keypoints, img_keypoints, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
imshow("Keypoints", img_keypoints);
waitKey(0);
return 0;
}
2、图像特征点检测的通用接口Ptr
Opencv为了方便用户使用图像特征点检测的相应算法,将全部的特征点检测都封在一个类似的API中,名为Ptr的模板类,也就是说,所有的特征检测算法都实现了相同的借口,detect 检测图像特征点.使用方法类似于
Ptr<相应的特征点检测类名>变量名 = 相应的特征点检测类::create()
变量名->detect(原图像,特征点向量).
使用上面描述的算法,就可以调用几乎全部的图像特征检测算法.但是注意,create函数有多个重载函数,如果为空,每个图像检测算法都会使用自己的一套默认的初始值来初始化类,如果想修改参数,那么create函数调用的时候需要根据检测类的不同,设置不同的初始化变量.
Mat Image = imread("1.jpg");//原图像
vector KeyPoints;//关键点KeyPoint类
Mat keyPointImage1;//在原图像上显示的特征点
Ptr fast = FastFeatureDetector::create();
fast->detect(Image,KeyPoints);
drawKeypoints(srcImage,detectKeyPoint,keyPointImage1,Scalar(0,0,255),DrawMatchesFlags::DEFAULT);
保存特征点各种信息的KeyPoint类在使用中是不透明的
class KeyPoint
{
Point2f pt; //特征点坐标
float size; //特征点邻域直径
float angle; //特征点的方向,值为0~360,负值表示不使用
float response; //特征点的响应强度,代表了该点是特征点的程度,可以用于后续处理中特征点排序
int octave; //特征点所在的图像金字塔的组
int class_id; //用于聚类的id
}
void drawKeypoints( const Mat& image, const vector& keypoints, CV_OUT Mat& outImage, const Scalar& color=Scalar::all(-1), int flags=DrawMatchesFlags::DEFAULT );
image:原始图像,可以使三通道或单通道图像;
keypoints:特征点向量,向量内每一个元素是一个KeyPoint对象,包含了特征点的各种属性信息;
outImage:特征点绘制的画布图像,可以是原图像;
color:绘制的特征点的颜色信息,默认绘制的是随机彩色;
flags:特征点的绘制模式,其实就是设置特征点的那些信息需要绘制,那些不需要绘制,有以下几种模式可选:
DEFAULT:只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标。
DRAW_OVER_OUTIMG:函数不创建输出的图像,而是直接在输出图像变量空间绘制,要求本身输出图像变量就 是一个初始化好了的,size与type都是已经初始化好的变量
NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制
DRAW_RICH_KEYPOINTS:绘制特征点的时候绘制的是一个个带有方向的圆,这种方法同时显示图像的坐