《OpenCV3学习笔记》3.2 :角点检测 FAST

一、原理

如果在这个大小为16个像素的圆上有n个连续的像素点,它们的像素值要么都比Ip+t大,要么都比Ip−t小,那么它就是一个角点。(如图1中的白色虚线所示)。n的值可以设置为12或者9,实验证明选择9可能会有更好的效果。

FAST算子是通过邻域像素的比对来检测特征点,所以没有多尺度的问题。

二、OpenCV 接口

1、FAST函数

void FASTX(InputArray image, vector<KeyPoint>& keypoints, int threshold, bool nonmaxSuppression=true, int type)

image 是输入的图像,

keypoints 是返回的特征点,

threshold 是定义的阈值,

第四个决定是否使用非极大值抑制。

1、

#include <opencv2/opencv.hpp> 
using namespace cv;

int main()
{
	Mat img = imread("house.png");
	//Keypoint类型
	std::vector<KeyPoint> 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<KeyPoint> KeyPoints;//关键点KeyPoint类
Mat keyPointImage1;//在原图像上显示的特征点


Ptr<FastFeatureDetector> fast = FastFeatureDetector::create();
fast->detect(Image,KeyPoints);
drawKeypoints(srcImage,detectKeyPoint,keyPointImage1,Scalar(0,0,255),DrawMatchesFlags::DEFAULT);     

2、keyPoint类型

保存特征点各种信息的KeyPoint类在使用中是不透明的

class KeyPoint
{
Point2f  pt;  //特征点坐标
float  size; //特征点邻域直径
float  angle; //特征点的方向,值为0~360,负值表示不使用
float  response; //特征点的响应强度,代表了该点是特征点的程度,可以用于后续处理中特征点排序
int  octave; //特征点所在的图像金字塔的组
int  class_id; //用于聚类的id
}

3、drawKeypoints函数

void drawKeypoints( const Mat& image, const vector<KeyPoint>& 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:绘制特征点的时候绘制的是一个个带有方向的圆,这种方法同时显示图像的坐      

猜你喜欢

转载自blog.csdn.net/try_again_later/article/details/81626038