#ifndef __OPENCV_FEATURES_2D_AKAZE_FEATURES_H__
#define __OPENCV_FEATURES_2D_AKAZE_FEATURES_H__
#include "AKAZEConfig.h"
#include "TEvolution.h"
namespace cv
{
class AKAZEFeatures {
private:
AKAZEOptions options_;
std::vector<TEvolution> evolution_;
int ncycles_;
bool reordering_;
std::vector<std::vector<float > > tsteps_;
std::vector<int> nsteps_;
cv::Mat descriptorSamples_;
cv::Mat descriptorBits_;
cv::Mat bitMask_;
public:
AKAZEFeatures(const AKAZEOptions& options);
void Allocate_Memory_Evolution();
int Create_Nonlinear_Scale_Space(const cv::Mat& img);
void Feature_Detection(std::vector<cv::KeyPoint>& kpts);
void Compute_Determinant_Hessian_Response(void);
void Compute_Multiscale_Derivatives(void);
void Find_Scale_Space_Extrema(std::vector<cv::KeyPoint>& kpts);
void Do_Subpixel_Refinement(std::vector<cv::KeyPoint>& kpts);
void Compute_Descriptors(std::vector<cv::KeyPoint>& kpts, cv::Mat& desc);
static void Compute_Main_Orientation(cv::KeyPoint& kpt, const std::vector<TEvolution>& evolution_);
};
void generateDescriptorSubsample(cv::Mat& sampleList, cv::Mat& comparisons,
int nbits, int pattern_size, int nchannels);
}
#endif