10 #include <aliceVision/types.hpp>
11 #include <aliceVision/numeric/numeric.hpp>
12 #include <aliceVision/feature/PointFeature.hpp>
13 #include <aliceVision/feature/Descriptor.hpp>
14 #include <aliceVision/feature/metric.hpp>
30 : _featureIndex(featureIndex),
37 bool operator<(
const FeatureInImage& other)
const {
return _featureIndex < other._featureIndex; }
52 std::vector<PointFeature> _vec_feats;
55 void LoadFeatures(
const std::string& sfileNameFeats) { loadFeatsFromFile(sfileNameFeats, _vec_feats); }
57 PointFeatures GetRegionsPositions()
const {
return PointFeatures(_vec_feats.begin(), _vec_feats.end()); }
59 Vec2 GetRegionPosition(std::size_t i)
const {
return Vec2f(_vec_feats[i].coords()).cast<
double>(); }
65 inline std::vector<PointFeature>&
Features() {
return _vec_feats; }
66 inline const std::vector<PointFeature>&
Features()
const {
return _vec_feats; }
72 virtual void Load(
const std::string& sfileNameFeats,
const std::string& sfileNameDescs) = 0;
74 virtual void Save(
const std::string& sfileNameFeats,
const std::string& sfileNameDescs)
const = 0;
76 virtual void SaveDesc(
const std::string& sfileNameDescs)
const = 0;
81 virtual bool IsScalar()
const = 0;
82 virtual bool IsBinary()
const = 0;
85 virtual std::string
Type_id()
const = 0;
86 virtual std::size_t DescriptorLength()
const = 0;
102 virtual void clearDescriptors() = 0;
113 virtual Regions* EmptyClone()
const = 0;
115 virtual std::unique_ptr<Regions> createFilteredRegions(
const std::vector<FeatureInImage>& featuresInImage,
116 std::vector<IndexT>& out_associated3dPoint,
117 std::map<IndexT, IndexT>& out_mapFullToLocal)
const = 0;
120 inline Regions::~Regions() {}
122 enum class ERegionType : bool
128 template<
typename T, ERegionType regionType>
143 template<
typename T, std::
size_t L, ERegionType regionType>
154 std::vector<DescriptorT> _vec_descs;
157 std::string
Type_id()
const override {
return typeid(T).name(); }
158 std::size_t DescriptorLength()
const override {
return static_cast<std::size_t
>(L); }
160 bool IsScalar()
const override {
return regionType == ERegionType::Scalar; }
161 bool IsBinary()
const override {
return regionType == ERegionType::Binary; }
163 Regions* EmptyClone()
const override {
return new This(); }
166 void Load(
const std::string& sfileNameFeats,
const std::string& sfileNameDescs)
override
168 loadFeatsFromFile(sfileNameFeats, this->_vec_feats);
169 loadDescsFromBinFile(sfileNameDescs, _vec_descs);
173 void Save(
const std::string& sfileNameFeats,
const std::string& sfileNameDescs)
const override
175 saveFeatsToFile(sfileNameFeats, this->_vec_feats);
176 saveDescsToBinFile(sfileNameDescs, _vec_descs);
179 void SaveDesc(
const std::string& sfileNameDescs)
const override { saveDescsToBinFile(sfileNameDescs, _vec_descs); }
182 inline std::vector<DescriptorT>&
Descriptors() {
return _vec_descs; }
183 inline const std::vector<DescriptorT>&
Descriptors()
const {
return _vec_descs; }
189 inline void clearDescriptors()
override { _vec_descs.clear(); }
191 inline void swap(This& other)
193 this->_vec_feats.swap(other._vec_feats);
194 _vec_descs.swap(other._vec_descs);
200 assert(i < this->_vec_descs.size());
201 assert(genericRegions);
204 const This* regionsT =
dynamic_cast<const This*
>(genericRegions);
216 assert(i < this->_vec_feats.size() && i < this->_vec_descs.size());
217 static_cast<This*
>(outRegionContainer)->_vec_feats.push_back(this->_vec_feats[i]);
218 static_cast<This*
>(outRegionContainer)->_vec_descs.push_back(this->_vec_descs[i]);
228 std::vector<IndexT>& out_associated3dPoint,
229 std::map<IndexT, IndexT>& out_mapFullToLocal)
const override
231 out_associated3dPoint.clear();
232 out_mapFullToLocal.clear();
235 std::unique_ptr<Regions> regions(regionsPtr);
236 regionsPtr->
Features().reserve(featuresInImage.size());
237 regionsPtr->
Descriptors().reserve(featuresInImage.size());
238 out_associated3dPoint.reserve(featuresInImage.size());
239 for (std::size_t i = 0; i < featuresInImage.size(); ++i)
242 regionsPtr->
Features().push_back(this->_vec_feats[feat._featureIndex]);
243 regionsPtr->
Descriptors().push_back(this->_vec_descs[feat._featureIndex]);
251 out_mapFullToLocal[feat._featureIndex] = i;
252 out_associated3dPoint.push_back(feat._point3dId);
258 template<
typename T, std::
size_t L>
261 template<std::
size_t L>