#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