OpenCv-C++-KAZE(AKAZE)區域性特徵檢測(一)
阿新 • • 發佈:2018-12-23
KAZE與AKAZE都是OpenCv中整合的API演算法,AKAZE是KAZE的加速版本(A表示Accelerated(加速的))。且AKAZE的執行效率要優於KAZE。
與SURF和SIFT不同(基於線性),KAZE(AKAZE)是基於非線性插值的方法,這一點在影象處理方面來說確實比SURF和SIFT要好,畢竟影象大多是不連續的。
KAZE(AKAZE)基本步驟與介紹:
1、AOS構造尺度空間;------非線性方法構造,SURF與SIFT基於線性方法構造。
2、Hessian矩陣特徵點檢測;
3、方向基於一階微分影象;------影象的旋轉不變性(旋轉角度)。
4、描述子生成。---------歸一化處理。
與SIFT和SURF的比較:
1、更加穩定;
2、非線性尺度空間;
3、AKAZE比KAZE素的更快;
4、比較新的演算法。
話不多說,上程式碼(KAZE):
#include<opencv2/opencv.hpp> #include<iostream> #include<math.h> using namespace cv; using namespace std; Mat src; int main(int argc, char** argv) { src = imread("D:/test/girl.png", IMREAD_GRAYSCALE); if (!src.data) { printf("圖片未找到..."); return -1; } imshow("input title", src); double t1 = getTickCount(); //檢測特徵點(非線性) Ptr<KAZE>detector = KAZE::create(); vector<KeyPoint> keypoints; detector->detect(src, keypoints, Mat()); double t2 = getTickCount(); double t = (t2 - t1) * 1000 / getTickFrequency();//結果轉化為毫秒 printf("特徵點尋找所花費時間(ms):%f",t); //繪製特徵點 Mat keypointsImg; //drawKeypoints(src, keypoints, keypointsImg, Scalar::all(-1), DrawMatchesFlags::DEFAULT); //DrawMatchesFlags::DEFAULT與0是等價的 drawKeypoints(src, keypoints, keypointsImg, Scalar::all(-1), 0); imshow("KAZE keypoints result", keypointsImg); waitKey(0); return 0; }
KAZE的執行結果與檢測時間:
1、執行結果:
花費時間:
可以看到,花費時間有點長,大概2秒左右。
其實AKAZE的程式碼跟KAZE幾乎完全一樣,只是改了Ptr<KAZE>detector = KAZE::create();
而已。
只需將上面程式碼改成如下樣子即可:Ptr<AKAZE>detector = AKAZE::create();
接下來放上AKAZE的程式碼:
#include<opencv2/opencv.hpp> #include<iostream> #include<math.h> using namespace cv; using namespace std; Mat src; int main(int argc, char** argv) { src = imread("D:/test/girl.png", IMREAD_GRAYSCALE); if (!src.data) { printf("圖片未找到..."); return -1; } imshow("input title", src); double t1 = getTickCount(); //檢測特徵點(非線性) Ptr<AKAZE>detector = AKAZE::create(); vector<KeyPoint> keypoints; detector->detect(src, keypoints, Mat()); double t2 = getTickCount(); double t = (t2 - t1) * 1000 / getTickFrequency();//結果轉化為毫秒 printf("特徵點尋找所花費時間(ms):%f",t); //繪製特徵點 Mat keypointsImg; //drawKeypoints(src, keypoints, keypointsImg, Scalar::all(-1), DrawMatchesFlags::DEFAULT); //DrawMatchesFlags::DEFAULT與0是等價的 drawKeypoints(src, keypoints, keypointsImg, Scalar::all(-1), 0); imshow("AKAZE keypoints result", keypointsImg); waitKey(0); return 0; }
AKAZE的執行結果與檢測時間:
1、執行結果:
花費時間:
AKAZE與KAZE比較,時間上幾乎少了很多,執行效率大大提高,所以說AKAZE是KAZE的加速版這一說法確實正確。