AliceVision
Photogrammetric Computer Vision Framework
ImageDescriber_SIFT.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/sift/ImageDescriber_SIFT_vlfeat.hpp>
12 
13 #if ALICEVISION_IS_DEFINED(ALICEVISION_HAVE_POPSIFT)
14  #include <aliceVision/gpu/gpu.hpp>
15  #include <aliceVision/feature/sift/ImageDescriber_SIFT_popSIFT.hpp>
16 #endif
17 
18 namespace aliceVision {
19 namespace feature {
20 
28 {
29  public:
30  explicit ImageDescriber_SIFT(const SiftParams& params = SiftParams(), bool isOriented = true)
31  : _params(params),
32  _isOriented(isOriented)
33  {
34 #if ALICEVISION_IS_DEFINED(ALICEVISION_HAVE_POPSIFT)
35  setUseCuda(gpu::gpuSupportCUDA(3, 0));
36 #else
37  setUseCuda(false);
38 #endif
39  }
40 
45  bool useCuda() const override { return _imageDescriberImpl->useCuda(); }
46 
51  bool useFloatImage() const override { return _imageDescriberImpl->useFloatImage(); }
52 
57  EImageDescriberType getDescriberType() const override { return _imageDescriberImpl->getDescriberType(); }
58 
66  std::size_t getMemoryConsumption(std::size_t width, std::size_t height) const override
67  {
68  return _imageDescriberImpl->getMemoryConsumption(width, height);
69  }
70 
75  void setUpRight(bool upRight) override { _isOriented = !upRight; }
76 
81  void setUseCuda(bool useCuda) override
82  {
83  if (_imageDescriberImpl != nullptr && this->useCuda() == useCuda)
84  return;
85 
86 #if ALICEVISION_IS_DEFINED(ALICEVISION_HAVE_POPSIFT)
87  if (useCuda)
88  {
89  _imageDescriberImpl.release(); // release first to ensure that we don't create the new ImageDescriber before destroying the previous one
90  _imageDescriberImpl.reset(new ImageDescriber_SIFT_popSIFT(_params, _isOriented));
91  return;
92  }
93 #endif
94 
95  _imageDescriberImpl.release(); // release first to ensure that we don't create the new ImageDescriber before destroying the previous one
96  _imageDescriberImpl.reset(new ImageDescriber_SIFT_vlfeat(_params, _isOriented));
97  }
98 
103  void setCudaPipe(int pipe) override { _imageDescriberImpl->setCudaPipe(pipe); }
104 
110  {
111  _params.setPreset(preset);
112  _imageDescriberImpl->setConfigurationPreset(preset);
113  }
114 
124  std::unique_ptr<Regions>& regions,
125  const image::Image<unsigned char>* mask = nullptr) override
126  {
127  return _imageDescriberImpl->describe(image, regions, mask);
128  }
129 
138  bool describe(const image::Image<float>& image, std::unique_ptr<Regions>& regions, const image::Image<unsigned char>* mask = nullptr) override
139  {
140  return _imageDescriberImpl->describe(image, regions, mask);
141  }
142 
147  void allocate(std::unique_ptr<Regions>& regions) const override { _imageDescriberImpl->allocate(regions); }
148 
149  ~ImageDescriber_SIFT() override = default;
150 
151  private:
152  SiftParams _params;
153  std::unique_ptr<ImageDescriber> _imageDescriberImpl = nullptr;
154  bool _isOriented = true;
155 };
156 
157 } // namespace feature
158 } // namespace aliceVision
aliceVision::feature::ImageDescriber_SIFT::useCuda
bool useCuda() const override
Check if the image describer use CUDA.
Definition: ImageDescriber_SIFT.hpp:45
aliceVision::feature::ImageDescriber_SIFT_popSIFT
Create an ImageDescriber interface for PopSIFT SIFT feature extractor.
Definition: ImageDescriber_SIFT_popSIFT.hpp:26
aliceVision::feature::SiftParams
Definition: SIFT.hpp:35
aliceVision::feature::ImageDescriber_SIFT::getDescriberType
EImageDescriberType getDescriberType() const override
Get the corresponding EImageDescriberType.
Definition: ImageDescriber_SIFT.hpp:57
aliceVision::feature::ImageDescriber_SIFT::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_SIFT.hpp:138
aliceVision::feature::ImageDescriber_SIFT::setUpRight
void setUpRight(bool upRight) override
Set image describer always upRight.
Definition: ImageDescriber_SIFT.hpp:75
aliceVision::feature::ImageDescriber_SIFT::allocate
void allocate(std::unique_ptr< Regions > &regions) const override
Allocate Regions type depending of the ImageDescriber.
Definition: ImageDescriber_SIFT.hpp:147
aliceVision::feature::ImageDescriber_SIFT::useFloatImage
bool useFloatImage() const override
Check if the image describer use float image.
Definition: ImageDescriber_SIFT.hpp:51
aliceVision
Definition: checkerDetector.cpp:32
aliceVision::feature::ImageDescriber
A pure virtual class for image description computation.
Definition: ImageDescriber.hpp:159
aliceVision::image::Image< unsigned char >
aliceVision::feature::ImageDescriber_SIFT
SIFT Image Describer class use :
Definition: ImageDescriber_SIFT.hpp:27
aliceVision::feature::ImageDescriber_SIFT::setUseCuda
void setUseCuda(bool useCuda) override
Set if yes or no imageDescriber need to use cuda implementation.
Definition: ImageDescriber_SIFT.hpp:81
aliceVision::feature::ImageDescriber_SIFT::setCudaPipe
void setCudaPipe(int pipe) override
set the CUDA pipe
Definition: ImageDescriber_SIFT.hpp:103
aliceVision::feature::ImageDescriber_SIFT_vlfeat
Create an ImageDescriber interface for VLFeat SIFT feature extractor.
Definition: ImageDescriber_SIFT_vlfeat.hpp:29
aliceVision::feature::ImageDescriber_SIFT::describe
bool describe(const image::Image< unsigned char > &image, std::unique_ptr< Regions > &regions, const image::Image< unsigned char > *mask=nullptr) override
Detect regions on the 8-bit image and compute their attributes (description)
Definition: ImageDescriber_SIFT.hpp:123
aliceVision::feature::ImageDescriber_SIFT::setConfigurationPreset
void setConfigurationPreset(ConfigurationPreset preset) override
Use a preset to control the number of detected regions.
Definition: ImageDescriber_SIFT.hpp:109
aliceVision::feature::ConfigurationPreset
Definition: ImageDescriber.hpp:118
aliceVision::feature::ImageDescriber_SIFT::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_SIFT.hpp:66