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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM