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

 

posted @ 2020-03-12 18:04  夕西行  阅读(4107)  评论(0编辑  收藏  举报