From 21105d0cad56b66883bf20ed57d02a4b57ff2523 Mon Sep 17 00:00:00 2001 From: Abdelrahman AL MAROUK Date: Fri, 22 Sep 2023 16:08:50 +0200 Subject: [PATCH] [WIP][filterSfM] fix reference issue and refactor code --- src/aliceVision/sfmData/SfMData.cpp | 16 ------- src/aliceVision/sfmData/SfMData.hpp | 10 ----- src/software/pipeline/main_filterSfM.cpp | 42 +++++++++++++++---- .../pipeline/main_prepareDenseScene.cpp | 28 +++++++++++-- 4 files changed, 58 insertions(+), 38 deletions(-) diff --git a/src/aliceVision/sfmData/SfMData.cpp b/src/aliceVision/sfmData/SfMData.cpp index cd02bf08c5..60907fefdb 100644 --- a/src/aliceVision/sfmData/SfMData.cpp +++ b/src/aliceVision/sfmData/SfMData.cpp @@ -331,21 +331,5 @@ LandmarksPerView getLandmarksPerViews(const SfMData& sfmData) return landmarksPerView; } -ObservationsPerView getObservationsPerViews(SfMData& sfmData) -{ - ObservationsPerView observationsPerView; - for(auto& landIt : sfmData.getLandmarks()) - { - for(const auto& obsIt : landIt.second.observations) - { - IndexT viewId = obsIt.first; - auto& landmarksSet = observationsPerView[viewId]; - landmarksSet.first.push_back(&obsIt.second); - landmarksSet.second.push_back(&landIt.second); - } - } - return observationsPerView; -} - } // namespace sfmData } // namespace aliceVision diff --git a/src/aliceVision/sfmData/SfMData.hpp b/src/aliceVision/sfmData/SfMData.hpp index 1647d6ae58..657d3b9550 100644 --- a/src/aliceVision/sfmData/SfMData.hpp +++ b/src/aliceVision/sfmData/SfMData.hpp @@ -577,15 +577,5 @@ using LandmarksPerView = stl::flat_map; LandmarksPerView getLandmarksPerViews(const SfMData& sfmData); -using ObservationsPerView = stl::flat_map, std::vector>>; - -/** - * @brief Get the landmark observations of camera views - * with the corresponding landmarks information. - * @param[in] sfmData: A given SfMData - * @return Observation information per camera view - */ -ObservationsPerView getObservationsPerViews(SfMData& sfmData); - } // namespace sfmData } // namespace aliceVision diff --git a/src/software/pipeline/main_filterSfM.cpp b/src/software/pipeline/main_filterSfM.cpp index 5b4cf00f84..ea695f6c35 100644 --- a/src/software/pipeline/main_filterSfM.cpp +++ b/src/software/pipeline/main_filterSfM.cpp @@ -58,8 +58,8 @@ struct ObservationsAdaptator /// CRTP helper method inline Derived& derived() { return *static_cast(this); } - const std::vector _data; - ObservationsAdaptator(const std::vector& data) + const std::vector _data; + ObservationsAdaptator(const std::vector& data) : _data(data) { } @@ -68,7 +68,7 @@ struct ObservationsAdaptator inline size_t kdtree_get_point_count() const { return _data.size(); } // Returns the dim'th component of the idx'th point in the class: - inline T kdtree_get_pt(const size_t idx, int dim) const { return _data[idx]->x(dim); } + inline T kdtree_get_pt(const size_t idx, int dim) const { return _data[idx].x(dim); } // Optional bounding-box computation: return false to default to a standard bbox computation loop. // Return true if the BBOX was already computed by the class and returned in "bb" so it can be avoided to redo it @@ -191,6 +191,30 @@ class PixSizeSearch inline double worstDist() const { return _radius_sq; } }; +using ObservationsPerView = stl::flat_map, std::vector>>; + +/** + * @brief Get the landmark observations of camera views + * with the corresponding landmarks information. + * @param[in] sfmData: A given SfMData + * @return Observation information per camera view + */ +ObservationsPerView getObservationsPerViews(SfMData& sfmData) +{ + ObservationsPerView observationsPerView; + for(auto& landIt : sfmData.getLandmarks()) + { + for(const auto& obsIt : landIt.second.observations) + { + IndexT viewId = obsIt.first; + auto& landmarksSet = observationsPerView[viewId]; + landmarksSet.first.push_back(obsIt.second); + landmarksSet.second.push_back(&landIt.second); + } + } + return observationsPerView; +} + bool filterLandmarks(SfMData& sfmData, double radiusScale, bool useFeatureScale, int minNbObservationsPerLandmark) { const auto initialNbLandmarks = sfmData.getLandmarks().size(); @@ -648,7 +672,7 @@ bool filterObservations2D(SfMData& sfmData, int nbNeighbors2D, float percentile, std::advance(itView, i); const IndexT viewId = *itView; - auto& observationsIt = observationsPerView.find(viewId); + auto observationsIt = observationsPerView.find(viewId); if(observationsIt == observationsPerView.end()) continue; @@ -669,7 +693,7 @@ bool filterObservations2D(SfMData& sfmData, int nbNeighbors2D, float percentile, cacheSize); for(auto j = 0; j < observations.size(); j++) { - const auto& obs = *observations[j]; + const auto& obs = observations[j]; std::vector indices_(nbNeighbors_); std::vector distances_(nbNeighbors_); tree.knnSearch(obs.x.data(), nbNeighbors_, &indices_[0], &distances_[0]); @@ -694,7 +718,7 @@ bool filterObservations2D(SfMData& sfmData, int nbNeighbors2D, float percentile, } estimatedRadii_[i] = radius; - std::vector filteredObservations; + std::vector filteredObservations; std::vector filteredLandmarks; filteredObservations.reserve(observations.size()); filteredLandmarks.reserve(landmarks.size()); @@ -724,14 +748,14 @@ bool filterObservations2D(SfMData& sfmData, int nbNeighbors2D, float percentile, if(estimatedRadii_[i] != -1.) estimatedRadii[viewId] = estimatedRadii_[i]; - auto& observationsIt = observationsPerView.find(viewId); + auto observationsIt = observationsPerView.find(viewId); if(observationsIt != observationsPerView.end()) { auto& observations = observationsIt->second.first; auto& landmarks = observationsIt->second.second; for(int j = 0; j < observations.size(); j++) { - landmarks[j]->observations[viewId] = *observations[j]; + landmarks[j]->observations[viewId] = observations[j]; } } } @@ -754,7 +778,7 @@ int aliceVision_main(int argc, char *argv[]) double neighborsInfluence = 0.5; int nbIterations = 5; int nbNeighbors2D = 5; - float percentile = 0.95; + float percentile = 0.95f; // user optional parameters std::vector featuresFolders; diff --git a/src/software/pipeline/main_prepareDenseScene.cpp b/src/software/pipeline/main_prepareDenseScene.cpp index 4478a40b93..1d1a1d5ccd 100644 --- a/src/software/pipeline/main_prepareDenseScene.cpp +++ b/src/software/pipeline/main_prepareDenseScene.cpp @@ -76,7 +76,29 @@ void process(const std::string &dstColorImage, const IntrinsicBase* cam, const o } } -bool prepareDenseScene(SfMData& sfmData, +using ObservationsPerView = stl::flat_map>; + +/** + * @brief Get the landmark observations of camera views. + * @param[in] sfmData: A given SfMData + * @return Observations per camera view + */ +ObservationsPerView getObservationsPerViews(const SfMData& sfmData) +{ + ObservationsPerView observationsPerView; + for(auto& landIt : sfmData.getLandmarks()) + { + for(const auto& obsIt : landIt.second.observations) + { + IndexT viewId = obsIt.first; + auto& observationsSet = observationsPerView[viewId]; + observationsSet.push_back(&obsIt.second); + } + } + return observationsPerView; +} + +bool prepareDenseScene(const SfMData& sfmData, const std::vector& imagesFolders, const std::vector& masksFolders, const std::string& maskExtension, @@ -126,7 +148,7 @@ bool prepareDenseScene(SfMData& sfmData, ALICEVISION_LOG_INFO("Median Camera Exposure: " << medianCameraExposure << ", Median EV: " << std::log2(1.0/medianCameraExposure)); bool doMaskLandmarks = landmarksMaskScale > 0.f; - sfmData::ObservationsPerView observationsPerView; + ObservationsPerView observationsPerView; HashMap estimatedRadii; if (doMaskLandmarks) { @@ -301,7 +323,7 @@ bool prepareDenseScene(SfMData& sfmData, const auto& observationsIt = observationsPerView.find(viewId); if(observationsIt != observationsPerView.end()) { - const auto& observations = observationsIt->second.first; + const auto& observations = observationsIt->second; int j = 0; for(const auto& observation : observations) {