Skip to content

Commit e9a4be5

Browse files
author
Matthieu Hog
committed
added unknown image detector/descriptor type
1 parent b3ce5af commit e9a4be5

File tree

6 files changed

+124
-5
lines changed

6 files changed

+124
-5
lines changed

src/aliceVision/feature/ImageDescriber.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,10 @@ std::unique_ptr<ImageDescriber> createImageDescriber(EImageDescriberType imageDe
228228
case EImageDescriberType::AKAZE_LIOP:
229229
describerPtr.reset(new ImageDescriber_AKAZE(AKAZEParams(AKAZEOptions(), feature::AKAZE_LIOP)));
230230
break;
231+
//Unknown descriptor to be used when the descriptor is computed outside of alicevsion
232+
case EImageDescriberType::UNKNOWN:
233+
describerPtr.reset(new UnknownImageDescriber());
234+
break;
231235

232236
#if ALICEVISION_IS_DEFINED(ALICEVISION_HAVE_CCTAG)
233237
case EImageDescriberType::CCTAG3:

src/aliceVision/feature/ImageDescriber.hpp

+110
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <aliceVision/numeric/numeric.hpp>
1111
#include <aliceVision/feature/imageDescriberCommon.hpp>
1212
#include <aliceVision/feature/Regions.hpp>
13+
#include <aliceVision/feature/regionsFactory.hpp>
1314
#include <aliceVision/image/Image.hpp>
1415
#include <memory>
1516

@@ -260,6 +261,115 @@ class ImageDescriber
260261
void LoadFeatures(Regions* regions, const std::string& sfileNameFeats) const { regions->LoadFeatures(sfileNameFeats); }
261262
};
262263

264+
/**
265+
* @brief Used to load descripters computed outside of meshroom.
266+
*/
267+
class UnknownImageDescriber : public ImageDescriber
268+
{
269+
public:
270+
UnknownImageDescriber() = default;
271+
272+
virtual ~UnknownImageDescriber() = default;
273+
274+
/**
275+
* @brief Check if the image describer use CUDA
276+
* @return True if the image describer use CUDA
277+
*/
278+
bool useCuda() const override { return false; }
279+
280+
/**
281+
* @brief Check if the image describer use float image
282+
* @return True if the image describer use float image
283+
*/
284+
bool useFloatImage() const override { return false; }
285+
286+
/**
287+
* @brief Get the corresponding EImageDescriberType
288+
* @return EImageDescriberType
289+
*/
290+
EImageDescriberType getDescriberType() const override { return EImageDescriberType::UNKNOWN; }
291+
292+
/**
293+
* @brief Get the total amount of RAM needed for a
294+
* feature extraction of an image of the given dimension.
295+
* @param[in] width The image width
296+
* @param[in] height The image height
297+
* @return total amount of memory needed
298+
*/
299+
std::size_t getMemoryConsumption(std::size_t width, std::size_t height) const override
300+
{
301+
return 0;
302+
}
303+
304+
/**
305+
* @brief Set image describer always upRight
306+
* @param[in] upRight
307+
*/
308+
void setUpRight(bool upRight) override
309+
{}
310+
311+
/**
312+
* @brief Set if yes or no imageDescriber need to use cuda implementation
313+
* @param[in] useCuda
314+
*/
315+
void setUseCuda(bool useCuda) override
316+
{}
317+
318+
/**
319+
* @brief set the CUDA pipe
320+
* @param[in] pipe The CUDA pipe id
321+
*/
322+
void setCudaPipe(int pipe) override
323+
{}
324+
325+
/**
326+
* @brief Use a preset to control the number of detected regions
327+
* @param[in] preset The preset configuration
328+
*/
329+
void setConfigurationPreset(ConfigurationPreset preset) override
330+
{}
331+
332+
/**
333+
* @brief Detect regions on the 8-bit image and compute their attributes (description)
334+
* @param[in] image Image.
335+
* @param[out] regions The detected regions and attributes (the caller must delete the allocated data)
336+
* @param[in] mask 8-bit grayscale image for keypoint filtering (optional)
337+
* Non-zero values depict the region of interest.
338+
* @return True if detection succed.
339+
*/
340+
bool describe(const image::Image<unsigned char>& image,
341+
std::unique_ptr<Regions>& regions,
342+
const image::Image<unsigned char>* mask = nullptr) override
343+
{
344+
return false;
345+
}
346+
347+
/**
348+
* @brief Detect regions on the float image and compute their attributes (description)
349+
* @param[in] image Image.
350+
* @param[out] regions The detected regions and attributes (the caller must delete the allocated data)
351+
* @param[in] mask 8-bit gray image for keypoint filtering (optional).
352+
* Non-zero values depict the region of interest.
353+
* @return True if detection succed.
354+
*/
355+
bool describe(const image::Image<float>& image, std::unique_ptr<Regions>& regions, const image::Image<unsigned char>* mask = nullptr) override
356+
{
357+
return false;
358+
}
359+
360+
/**
361+
* @brief Allocate Regions type depending of the ImageDescriber
362+
* @param[in,out] regions
363+
*/
364+
void allocate(std::unique_ptr<Regions>& regions) const override
365+
{
366+
regions.reset(new UNKNOWN_Regions);
367+
}
368+
369+
private:
370+
std::unique_ptr<ImageDescriber> _imageDescriberImpl = nullptr;
371+
};
372+
263373
/**
264374
* @brief Create the desired ImageDescriber method.
265375
* Don't use a factory, perform direct allocation.

src/aliceVision/feature/imageDescriberCommon.hpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,8 @@ enum class EImageDescriberType : unsigned char
2323
SIFT = 10,
2424
SIFT_FLOAT = 11,
2525
SIFT_UPRIGHT = 12,
26-
DSPSIFT = 13
27-
28-
,
26+
DSPSIFT = 13,
27+
2928
AKAZE = 20,
3029
AKAZE_LIOP = 21,
3130
AKAZE_MLDB = 22

src/aliceVision/feature/regionsFactory.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,8 @@ using AKAZE_Liop_Regions = ScalarRegions<unsigned char, 144>;
2929
/// Define the AKAZE Keypoint (with a binary descriptor saved in an uchar array)
3030
using AKAZE_BinaryRegions = BinaryRegions<64>;
3131

32+
/// Define an unknown feature regions
33+
using UNKNOWN_Regions = ScalarRegions<float, 128>;
34+
3235
} // namespace feature
3336
} // namespace aliceVision

src/aliceVision/sfm/pipeline/regionsIO.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ using namespace sfmData;
2626
std::unique_ptr<feature::Regions> loadRegions(const std::vector<std::string>& folders, IndexT viewId, const feature::ImageDescriber& imageDescriber)
2727
{
2828
assert(!folders.empty());
29-
29+
3030
const std::string imageDescriberTypeName = feature::EImageDescriberType_enumToString(imageDescriber.getDescriberType());
3131
const std::string basename = std::to_string(viewId);
3232

@@ -228,7 +228,7 @@ bool loadRegionsPerView(feature::RegionsPerView& regionsPerView,
228228
std::unique_ptr<feature::Regions> regionsPtr;
229229
try
230230
{
231-
regionsPtr = loadRegions(featuresFolders, iter->second.get()->getViewId(), *(imageDescribers.at(i)));
231+
regionsPtr = loadRegions(featuresFolders, iter->second.get()->getViewId(), *(imageDescribers.at(i)));
232232
}
233233
catch (const std::exception& e)
234234
{

src/aliceVision/voctree/VocabularyTree.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,9 @@ inline std::unique_ptr<IVocabularyTree> createVoctreeForDescriberType(feature::E
360360
case EImageDescriberType::AKAZE_MLDB:
361361
res.reset(new VocabularyTree<AKAZE_BinaryRegions::DescriptorT>);
362362
break;
363+
case EImageDescriberType::UNKNOWN:
364+
res.reset(new VocabularyTree<UNKNOWN_Regions::DescriptorT>);
365+
break;
363366

364367
#if ALICEVISION_IS_DEFINED(ALICEVISION_HAVE_CCTAG)
365368
case EImageDescriberType::CCTAG3:

0 commit comments

Comments
 (0)