KAZE、AKAZE特征点
AKAZE是KAZE的加速版,sift,surf等特征都是通过高斯核进行线性尺度空间进行特征检测的,相同尺度下每个点的变换是一样的,由于高斯函数是低通滤波函数,会平滑图像边缘,以至图像损失掉许多细节信息。针对这一问题,作者提出了一种基于非线性尺度空间的特征点检测方法,该非线性尺度空间保证了图像边缘在尺度变化中信息损失量非常少,从而极大地保持了图像细节信息。
【函数】
Ptr<KAZE> create(bool extended=false, bool upright=false, float threshold = 0.001f, int nOctaves = 4, int nOctaveLayers = 4, int diffusivity = KAZE::DIFF_PM_G2);
Ptr<AKAZE> create(int descriptor_type=AKAZE::DESCRIPTOR_MLDB, int descriptor_size = 0, int descriptor_channels = 3, float threshold = 0.001f, int nOctaves = 4, int nOctaveLayers = 4, int diffusivity = KAZE::DIFF_PM_G2);
【参数】原理链接
extended——是否使用 128 维特性集合
upright——不考虑关键点的方向,直接设置为垂直,这被称为 upright-SURF 或者 U-SURF
threshold ——阈值
nOctaves ——多少尺度及范围将参与计算。nOctave 的默认值 4 可以适用于大多数场景,减少到 3 并不会获得太多的性能提高。
nOctaveLayers ——nOctaveLayers 被某些研究证明设为 4 可能更有用,但计算代价更大。
diffusivity ——扩散类型
descriptor_type——描述符类型
descriptor_size ——描述符尺寸
descriptor_channels ——描述符通道数
【案例】
#include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main() { Mat srcImage = imread("D:/sunflower.png"); Mat srcGrayImage; if (srcImage.channels() == 3) { cvtColor(srcImage,srcGrayImage,CV_RGB2GRAY); } else { srcImage.copyTo(srcGrayImage); } vector<KeyPoint>detectKeyPoint; Mat keyPointImage; Ptr<KAZE> kaze = KAZE::create();//把KAZE换成AKAZE即可 kaze->detect(srcGrayImage,detectKeyPoint); drawKeypoints(srcImage,detectKeyPoint,keyPointImage,Scalar(0,0,255),DrawMatchesFlags::DEFAULT); imshow("src image",srcImage); imshow("keyPoint",keyPointImage); waitKey(0); return 0; }