AliceVision
Photogrammetric Computer Vision Framework
ImageDescriber_DSPSIFT_vlfeat.hpp
1 // This file is part of the AliceVision project.
2 // Copyright (c) 2020 AliceVision contributors.
3 // This Source Code Form is subject to the terms of the Mozilla Public License,
4 // v. 2.0. If a copy of the MPL was not distributed with this file,
5 // You can obtain one at https://mozilla.org/MPL/2.0/.
6 
7 #pragma once
8 
9 #include <aliceVision/feature/Descriptor.hpp>
10 #include <aliceVision/feature/ImageDescriber.hpp>
11 #include <aliceVision/feature/regionsFactory.hpp>
12 #include <aliceVision/feature/sift/SIFT.hpp>
13 
14 extern "C"
15 {
16 #include <nonFree/sift/vl/sift.h>
17 }
18 
19 #include <iostream>
20 #include <numeric>
21 
22 namespace aliceVision {
23 namespace feature {
24 
25 struct DspSiftParams : public SiftParams
26 {
27  bool domainSizePooling = true;
28  bool estimateAffineShape = false;
29  double dspMinScale = 1.0 / 6.0;
30  double dspMaxScale = 3.0;
31  int dspNumScales = 10;
32 
33  void setPreset(ConfigurationPreset preset) override;
34 };
35 
36 template<typename T>
37 bool extractDSPSIFT(const image::Image<float>& image,
38  std::unique_ptr<Regions>& regions,
39  const DspSiftParams& params,
40  bool orientation,
41  const image::Image<unsigned char>* mask);
42 
60 {
61  public:
62  explicit ImageDescriber_DSPSIFT_vlfeat(const DspSiftParams& params = DspSiftParams(), bool isOriented = true)
63  : ImageDescriber(),
64  _params(params),
65  _isOriented(isOriented)
66  {
67  // Configure VLFeat
68  VLFeatInstance::initialize();
69  }
70 
71  ~ImageDescriber_DSPSIFT_vlfeat() override { VLFeatInstance::destroy(); }
72 
77  bool useCuda() const override { return false; }
78 
83  bool useFloatImage() const override { return true; }
84 
89  EImageDescriberType getDescriberType() const override { return EImageDescriberType::DSPSIFT; }
90 
98  std::size_t getMemoryConsumption(std::size_t width, std::size_t height) const override
99  {
100  return getMemoryConsumptionVLFeat(width, height, _params);
101  }
102 
107  void setUpRight(bool upRight) override { _isOriented = !upRight; }
108 
113  void setConfigurationPreset(ConfigurationPreset preset) override { _params.setPreset(preset); }
114 
123  bool describe(const image::Image<float>& image, std::unique_ptr<Regions>& regions, const image::Image<unsigned char>* mask = nullptr) override
124  {
125  return extractDSPSIFT<unsigned char>(image, regions, _params, _isOriented, mask);
126  }
127 
132  void allocate(std::unique_ptr<Regions>& regions) const override { regions.reset(new SIFT_Regions); }
133 
134  private:
135  DspSiftParams _params;
136  bool _isOriented;
137 };
138 
139 } // namespace feature
140 } // namespace aliceVision
aliceVision::feature::ImageDescriber_DSPSIFT_vlfeat::setConfigurationPreset
void setConfigurationPreset(ConfigurationPreset preset) override
Use a preset to control the number of detected regions.
Definition: ImageDescriber_DSPSIFT_vlfeat.hpp:113
aliceVision::feature::ImageDescriber_DSPSIFT_vlfeat::useFloatImage
bool useFloatImage() const override
Check if the image describer use float image.
Definition: ImageDescriber_DSPSIFT_vlfeat.hpp:83
aliceVision::feature::ImageDescriber_DSPSIFT_vlfeat::setUpRight
void setUpRight(bool upRight) override
Set image describer always upRight.
Definition: ImageDescriber_DSPSIFT_vlfeat.hpp:107
aliceVision::feature::ImageDescriber_DSPSIFT_vlfeat::getDescriberType
EImageDescriberType getDescriberType() const override
Get the corresponding EImageDescriberType.
Definition: ImageDescriber_DSPSIFT_vlfeat.hpp:89
aliceVision::feature::SiftParams
Definition: SIFT.hpp:35
aliceVision::feature::ImageDescriber_DSPSIFT_vlfeat::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_DSPSIFT_vlfeat.hpp:123
aliceVision
Definition: checkerDetector.cpp:32
aliceVision::feature::ImageDescriber
A pure virtual class for image description computation.
Definition: ImageDescriber.hpp:159
aliceVision::feature::ImageDescriber_DSPSIFT_vlfeat::allocate
void allocate(std::unique_ptr< Regions > &regions) const override
Allocate Regions type depending of the ImageDescriber.
Definition: ImageDescriber_DSPSIFT_vlfeat.hpp:132
aliceVision::feature::ImageDescriber_DSPSIFT_vlfeat::useCuda
bool useCuda() const override
Check if the image describer use CUDA.
Definition: ImageDescriber_DSPSIFT_vlfeat.hpp:77
aliceVision::image::Image< float >
aliceVision::feature::ImageDescriber_DSPSIFT_vlfeat::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_DSPSIFT_vlfeat.hpp:98
aliceVision::feature::DspSiftParams
Definition: ImageDescriber_DSPSIFT_vlfeat.hpp:25
aliceVision::feature::FeatDescRegions
Definition: Regions.hpp:144
aliceVision::feature::ImageDescriber_DSPSIFT_vlfeat
Create an ImageDescriber interface for VLFeat SIFT feature extractor.
Definition: ImageDescriber_DSPSIFT_vlfeat.hpp:59
aliceVision::feature::ConfigurationPreset
Definition: ImageDescriber.hpp:118