@@ -56,9 +56,18 @@ struct LandmarksAdaptator
5656 inline Derived& derived () { return *static_cast <Derived*>(this ); }
5757
5858 const std::vector<Landmark> _data;
59+ const std::vector<Landmark*> _data_ptr;
60+ bool usePtr;
5961 LandmarksAdaptator (const std::vector<Landmark>& data)
6062 : _data(data)
6163 {
64+ usePtr = false ;
65+ }
66+
67+ LandmarksAdaptator (const std::vector<Landmark*>& data)
68+ : _data_ptr(data)
69+ {
70+ usePtr = true ;
6271 }
6372
6473 // Must return the number of data points
@@ -67,7 +76,7 @@ struct LandmarksAdaptator
6776 // Returns the dim'th component of the idx'th point in the class:
6877 inline T kdtree_get_pt (const size_t idx, int dim) const
6978 {
70- return _data[idx].X (dim);
79+ return usePtr ? _data_ptr[idx]-> X (dim) : _data[idx].X (dim);
7180 }
7281
7382 // Optional bounding-box computation: return false to default to a standard bbox computation loop.
@@ -234,7 +243,7 @@ bool filterLandmarks(SfMData& sfmData, double radiusScale, bool useFeatureScale,
234243 filteredLandmarks[newIdx++] = std::make_pair (newIdx, landmarksData[i]);
235244 }
236245 }
237- sfmData.getLandmarks () = Landmarks (filteredLandmarks.begin (), filteredLandmarks.end ());
246+ sfmData.getLandmarks () = std::move ( Landmarks (filteredLandmarks.begin (), filteredLandmarks.end () ));
238247 ALICEVISION_LOG_INFO (" Removing landmarks based on pixel size: done." );
239248
240249 return true ;
@@ -299,12 +308,12 @@ bool filterObservations(SfMData& sfmData, int maxNbObservationsPerLandmark)
299308bool filterObservations2 (SfMData& sfmData, int maxNbObservationsPerLandmark, int nbNeighbors = 10 , int nbIterations = 5 ,
300309 double fraction = 0.5 )
301310{
302- std::vector<Landmark> landmarksData (sfmData.getLandmarks ().size ());
311+ std::vector<Landmark* > landmarksData (sfmData.getLandmarks ().size ());
303312 {
304313 size_t i = 0 ;
305314 for (auto & it : sfmData.getLandmarks ())
306315 {
307- landmarksData[i++] = it.second ;
316+ landmarksData[i++] = & it.second ;
308317 }
309318 }
310319
@@ -314,7 +323,7 @@ bool filterObservations2(SfMData& sfmData, int maxNbObservationsPerLandmark, int
314323#pragma omp parallel for
315324 for (auto i = 0 ; i < landmarksData.size (); i++)
316325 {
317- const sfmData::Landmark& landmark = landmarksData[i];
326+ const sfmData::Landmark& landmark = * landmarksData[i];
318327
319328 // compute observation scores
320329
@@ -366,7 +375,7 @@ bool filterObservations2(SfMData& sfmData, int maxNbObservationsPerLandmark, int
366375#pragma omp parallel for
367376 for (auto i = 0 ; i < landmarksData.size (); i++)
368377 {
369- const sfmData::Landmark& landmark = landmarksData[i];
378+ const sfmData::Landmark& landmark = * landmarksData[i];
370379 auto & [indices_, weights_] = neighborsData[i];
371380 // a landmark is a neighbor to itself with zero distance
372381 indices_.resize (nbNeighbors + 1 );
@@ -449,7 +458,7 @@ bool filterObservations2(SfMData& sfmData, int maxNbObservationsPerLandmark, int
449458#pragma omp parallel for
450459 for (auto i = 0 ; i < landmarksData.size (); i++)
451460 {
452- sfmData::Landmark& landmark = landmarksData[i];
461+ sfmData::Landmark& landmark = * landmarksData[i];
453462 const auto & nbObservations = landmark.observations .size ();
454463 auto & [viewIds, viewScores] = viewScoresData[i];
455464
0 commit comments