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