AliceVision
Photogrammetric Computer Vision Framework
ImageDescriber_AKAZE.hpp
1 // This file is part of the AliceVision project.
2 // Copyright (c) 2016 AliceVision contributors.
3 // Copyright (c) 2012 openMVG contributors.
4 // This Source Code Form is subject to the terms of the Mozilla Public License,
5 // v. 2.0. If a copy of the MPL was not distributed with this file,
6 // You can obtain one at https://mozilla.org/MPL/2.0/.
7 
8 #pragma once
9 
10 #include <aliceVision/config.hpp>
11 #include <aliceVision/feature/ImageDescriber.hpp>
12 #include <aliceVision/feature/imageDescriberCommon.hpp>
13 #include <aliceVision/feature/regionsFactory.hpp>
14 #include <aliceVision/feature/akaze/AKAZE.hpp>
15 #include <aliceVision/feature/akaze/descriptorLIOP.hpp>
16 #include <aliceVision/feature/akaze/descriptorMLDB.hpp>
17 #include <aliceVision/feature/akaze/descriptorMSURF.hpp>
18 
19 namespace aliceVision {
20 namespace feature {
21 
22 enum EAKAZE_DESCRIPTOR
23 {
24  AKAZE_MSURF,
25  AKAZE_LIOP,
26  AKAZE_MLDB
27 };
28 
30 {
31  AKAZEParams(AKAZEOptions akazeOptions = AKAZEOptions(), EAKAZE_DESCRIPTOR eAkazeDescriptor = AKAZE_MSURF)
32  : options(akazeOptions),
33  akazeDescriptorType(eAkazeDescriptor)
34  {}
35 
36  // parameters
37  AKAZEOptions options;
38  EAKAZE_DESCRIPTOR akazeDescriptorType;
39 };
40 
42 {
43  public:
44  explicit ImageDescriber_AKAZE(const AKAZEParams& params = AKAZEParams(), bool isOriented = true)
45  : ImageDescriber(),
46  _params(params),
47  _isOriented(isOriented)
48  {}
49 
54  bool useCuda() const override { return false; }
55 
60  bool useFloatImage() const override { return true; }
61 
66  EImageDescriberType getDescriberType() const override
67  {
68  switch (_params.akazeDescriptorType)
69  {
70  case AKAZE_MSURF:
71  return EImageDescriberType::AKAZE;
72  case AKAZE_LIOP:
73  return EImageDescriberType::AKAZE_LIOP;
74  case AKAZE_MLDB:
75  return EImageDescriberType::AKAZE_MLDB;
76  }
77  throw std::logic_error("Unknown AKAZE type.");
78  }
79 
87  std::size_t getMemoryConsumption(std::size_t width, std::size_t height) const override
88  {
89  std::size_t fullImgSize = width * height;
90  std::size_t memoryConsuption = 0;
91  double downscale = 1.0;
92  for (int octave = 0; octave < _params.options.nbOctaves; ++octave)
93  {
94  memoryConsuption += fullImgSize / (downscale * downscale);
95  downscale *= 2.0;
96  }
97  memoryConsuption *= _params.options.nbSlicePerOctave * sizeof(float);
98  return 4 * memoryConsuption + (3 * width * height * sizeof(float)) + 1.5 * std::pow(2, 30); // add arbitrary 1.5 GB
99  }
100 
105  void setUpRight(bool upRight) override { _isOriented = !upRight; }
106 
112  {
113  switch (preset.descPreset)
114  {
115  case EImageDescriberPreset::LOW:
116  {
117  _params.options.maxTotalKeypoints = 5000;
118  break;
119  }
120  case EImageDescriberPreset::MEDIUM:
121  {
122  _params.options.maxTotalKeypoints = 10000;
123  break;
124  }
125  case EImageDescriberPreset::NORMAL:
126  {
127  _params.options.maxTotalKeypoints = 20000;
128  _params.options.threshold = AKAZEOptions().threshold;
129  break;
130  }
131  case EImageDescriberPreset::HIGH:
132  {
133  _params.options.maxTotalKeypoints = 50000;
134  _params.options.threshold = AKAZEOptions().threshold / 10.f;
135  break;
136  }
137  case EImageDescriberPreset::ULTRA:
138  {
139  _params.options.maxTotalKeypoints = 100000;
140  _params.options.threshold = AKAZEOptions().threshold / 100.f;
141  break;
142  }
143  default:
144  throw std::out_of_range("Invalid image describer preset enum");
145  }
146  if (!preset.gridFiltering)
147  {
148  // disable grid filtering
149  _params.options.maxTotalKeypoints = 0;
150  }
151  }
152 
160  bool describe(const image::Image<float>& image, std::unique_ptr<Regions>& regions, const image::Image<unsigned char>* mask = nullptr) override;
161 
166  void allocate(std::unique_ptr<Regions>& regions) const override
167  {
168  switch (_params.akazeDescriptorType)
169  {
170  case AKAZE_MSURF:
171  regions.reset(new AKAZE_Float_Regions);
172  break;
173  case AKAZE_LIOP:
174  regions.reset(new AKAZE_Liop_Regions);
175  break;
176  case AKAZE_MLDB:
177  regions.reset(new AKAZE_BinaryRegions);
178  break;
179  }
180  }
181 
182  ~ImageDescriber_AKAZE() override = default;
183 
184  private:
185  AKAZEParams _params;
186  bool _isOriented = true;
187 };
188 
189 } // namespace feature
190 } // namespace aliceVision
aliceVision::feature::AKAZEOptions
Definition: AKAZE.hpp:43
aliceVision::feature::ImageDescriber_AKAZE::getDescriberType
EImageDescriberType getDescriberType() const override
Get the corresponding EImageDescriberType.
Definition: ImageDescriber_AKAZE.hpp:66
aliceVision::feature::ImageDescriber_AKAZE::allocate
void allocate(std::unique_ptr< Regions > &regions) const override
Allocate Regions type depending of the ImageDescriber.
Definition: ImageDescriber_AKAZE.hpp:166
aliceVision::feature::AKAZEOptions::nbSlicePerOctave
int nbSlicePerOctave
levels per octave
Definition: AKAZE.hpp:48
aliceVision
Definition: checkerDetector.cpp:32
aliceVision::feature::AKAZEParams
Definition: ImageDescriber_AKAZE.hpp:29
aliceVision::feature::ImageDescriber
A pure virtual class for image description computation.
Definition: ImageDescriber.hpp:159
aliceVision::feature::ImageDescriber_AKAZE::useCuda
bool useCuda() const override
Check if the image describer use CUDA.
Definition: ImageDescriber_AKAZE.hpp:54
aliceVision::feature::AKAZEOptions::nbOctaves
int nbOctaves
octave to process
Definition: AKAZE.hpp:46
aliceVision::image::Image< float >
aliceVision::feature::ImageDescriber_AKAZE::setConfigurationPreset
void setConfigurationPreset(ConfigurationPreset preset) override
Use a preset to control the number of detected regions.
Definition: ImageDescriber_AKAZE.hpp:111
aliceVision::feature::ImageDescriber_AKAZE::useFloatImage
bool useFloatImage() const override
Check if the image describer use float image.
Definition: ImageDescriber_AKAZE.hpp:60
aliceVision::feature::ImageDescriber_AKAZE::getMemoryConsumption
std::size_t getMemoryConsumption(std::size_t width, std::size_t height) const override
Get the total amount of RAM needed for a feature extraction of an image of the given dimension.
Definition: ImageDescriber_AKAZE.hpp:87
aliceVision::feature::ImageDescriber_AKAZE::setUpRight
void setUpRight(bool upRight) override
Set image describer always upRight.
Definition: ImageDescriber_AKAZE.hpp:105
aliceVision::feature::ImageDescriber_AKAZE::describe
bool describe(const image::Image< float > &image, std::unique_ptr< Regions > &regions, const image::Image< unsigned char > *mask=nullptr) override
Detect regions on the float image and compute their attributes (description)
Definition: ImageDescriber_AKAZE.cpp:13
aliceVision::feature::FeatDescRegions
Definition: Regions.hpp:144
aliceVision::feature::AKAZEOptions::maxTotalKeypoints
std::size_t maxTotalKeypoints
maximum number of keypoints
Definition: AKAZE.hpp:58
aliceVision::feature::ConfigurationPreset
Definition: ImageDescriber.hpp:118
aliceVision::feature::ImageDescriber_AKAZE
Definition: ImageDescriber_AKAZE.hpp:41
aliceVision::feature::AKAZEOptions::threshold
float threshold
hessian determinant threshold
Definition: AKAZE.hpp:52