1. 程式人生 > >OpenCv-C++-KAZE(AKAZE)區域性特徵檢測(一)

OpenCv-C++-KAZE(AKAZE)區域性特徵檢測(一)

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的加速版這一說法確實正確。