AliceVision
Photogrammetric Computer Vision Framework
RegionsPerView.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/types.hpp>
11 #include <aliceVision/feature/Regions.hpp>
12 #include <aliceVision/feature/ImageDescriber.hpp>
13 #include <aliceVision/feature/imageDescriberCommon.hpp>
14 
15 #include <memory>
16 
17 namespace aliceVision {
18 namespace feature {
19 
21 class MapRegionsPerDesc : public std::map<feature::EImageDescriberType, std::unique_ptr<feature::Regions>>
22 {
23  public:
24  std::size_t getNbAllRegions() const
25  {
26  std::size_t nb = 0;
27  for (const auto& it : *this)
28  nb += it.second->RegionCount();
29  return nb;
30  }
31 
32  template<class T>
33  T getRegions(feature::EImageDescriberType descType)
34  {
35  return dynamic_cast<T&>(*this->at(descType));
36  }
37 
38  template<class T>
39  const T getRegions(feature::EImageDescriberType descType) const
40  {
41  return dynamic_cast<const T&>(*this->at(descType));
42  }
43 };
44 
45 using MapRegionsPerView = std::map<IndexT, MapRegionsPerDesc>;
46 
47 template<class MapFeatOrRegionsPerDesc>
48 inline std::vector<feature::EImageDescriberType> getCommonDescTypes(const MapFeatOrRegionsPerDesc& regionsA, const MapFeatOrRegionsPerDesc& regionsB)
49 {
50  std::vector<feature::EImageDescriberType> descTypes;
51  for (const auto& regionsPerDesc : regionsA)
52  {
53  const auto desc = regionsPerDesc.first;
54  if (regionsB.count(desc) > 0)
55  {
56  descTypes.push_back(desc);
57  }
58  }
59  return descTypes;
60 }
61 
66 {
67  public:
68  MapRegionsPerView& getData() { return _data; }
69 
70  const MapRegionsPerView& getData() const { return _data; }
71 
72  // TODO: to remove
73  const feature::Regions& getFirstViewRegions(feature::EImageDescriberType descType) const
74  {
75  assert(descType != feature::EImageDescriberType::UNINITIALIZED);
76  return *(_data.begin()->second.at(descType).get());
77  }
78 
79  const feature::MapRegionsPerDesc& getRegionsPerDesc(IndexT viewId) const { return _data.at(viewId); }
80  const feature::MapRegionsPerDesc& getDataPerDesc(IndexT viewId) const { return _data.at(viewId); }
81 
82  const feature::Regions& getRegions(IndexT viewId, feature::EImageDescriberType descType) const
83  {
84  assert(descType != feature::EImageDescriberType::UNINITIALIZED);
85  return *(_data.at(viewId).at(descType).get());
86  }
87 
88  const MapRegionsPerDesc& getAllRegions(IndexT viewId) const { return _data.at(viewId); }
89 
90  bool viewExist(IndexT viewId) const { return _data.count(viewId) > 0; }
91 
92  bool isEmpty() const { return _data.empty(); }
93 
94  void addRegions(IndexT viewId, feature::EImageDescriberType descType, feature::Regions* regionsPtr)
95  {
96  assert(descType != feature::EImageDescriberType::UNINITIALIZED);
97  _data[viewId][descType].reset(regionsPtr);
98  }
99 
100  std::vector<feature::EImageDescriberType> getCommonDescTypes(const Pair& pair) const
101  {
102  const auto& regionsA = getAllRegions(pair.first);
103  const auto& regionsB = getAllRegions(pair.second);
104  return aliceVision::feature::getCommonDescTypes(regionsA, regionsB);
105  }
106 
107  void clearDescriptors()
108  {
109  for (auto& itA : _data)
110  {
111  for (auto& itB : itA.second)
112  {
113  itB.second->clearDescriptors();
114  }
115  }
116  }
117 
118  private:
119  MapRegionsPerView _data;
120 };
121 
122 } // namespace feature
123 } // namespace aliceVision
aliceVision
Definition: checkerDetector.cpp:32
aliceVision::feature::MapRegionsPerDesc
Regions per ViewId of the considered SfMData container.
Definition: RegionsPerView.hpp:21
aliceVision::feature::Regions
The Regions class describe a set of regions extracted from an image. It contains both a feature (posi...
Definition: Regions.hpp:46
aliceVision::feature::RegionsPerView
Container for all Regions (Features and Descriptors) for each View.
Definition: RegionsPerView.hpp:65