From cbec64259719f7a95378cf5a3d1985240df3f21a Mon Sep 17 00:00:00 2001 From: Alice Sonolet Date: Tue, 29 Jul 2025 10:59:03 +0200 Subject: [PATCH 1/3] [node] sfmFilter : Add new removeUnselectedPoses option --- meshroom/aliceVision/SfMFilter.py | 6 +++++ src/software/utils/main_sfmFilter.cpp | 39 +++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/meshroom/aliceVision/SfMFilter.py b/meshroom/aliceVision/SfMFilter.py index 06d89f4bad..b53c015363 100644 --- a/meshroom/aliceVision/SfMFilter.py +++ b/meshroom/aliceVision/SfMFilter.py @@ -30,6 +30,12 @@ class SfMFilter(desc.CommandLineNode): r'".*\/(.*?)_.*\.\w{3}"', value=r'.*\/(.*?)\.\w{3}', ), + desc.BoolParam( + name="prunePoses", + label="Remove unselected poses", + description="Set to True to prune poses related to views that are not selected.", + value=False, + ), desc.ChoiceParam( name="verboseLevel", label="Verbose Level", diff --git a/src/software/utils/main_sfmFilter.cpp b/src/software/utils/main_sfmFilter.cpp index 20dca089ab..9c8afe4ad0 100644 --- a/src/software/utils/main_sfmFilter.cpp +++ b/src/software/utils/main_sfmFilter.cpp @@ -37,6 +37,7 @@ int aliceVision_main(int argc, char** argv) std::string outputSfMFilenameSelected; std::string outputSfMFilenameUnselected; std::string fileMatchingPattern; + bool prunePoses; // clang-format off po::options_description requiredParams("Required parameters"); @@ -45,6 +46,7 @@ int aliceVision_main(int argc, char** argv) "Path to the input SfMData file.\n") ("fileMatchingPattern,m", po::value(&fileMatchingPattern)->required(), "Matching pattern for the from_filepath method.\n") + ("prunePoses,p", po::value(&prunePoses)->required(), "Prune unselected poses.\n") ("outputSfMData_selected,o", po::value(&outputSfMFilenameSelected)->required(), "Path to the output SfMData file.\n") ("outputSfMData_unselected,o", po::value(&outputSfMFilenameUnselected)->required(), @@ -69,6 +71,7 @@ int aliceVision_main(int argc, char** argv) std::regex re(fileMatchingPattern); std::vector selectedViews; + std::vector selectedPoses; for (auto& viewIt : sfmData.getViews()) { @@ -77,9 +80,13 @@ int aliceVision_main(int argc, char** argv) if (std::regex_search(imagePath, matches, re)) { selectedViews.push_back(viewIt.first); + if (prunePoses) + selectedPoses.push_back(viewIt.second->getPoseId()); } } + // Split views into the selected and unselected SfmData + sfmData::SfMData outputSfMData_selected = sfmData; sfmData::SfMData outputSfMData_unselected = sfmData; std::set viewIdsToRemove; @@ -109,6 +116,38 @@ int aliceVision_main(int argc, char** argv) outputSfMData_unselected.getViews().erase(r); } + // Split poses into the selected and unselected SfmData + + if (prunePoses) + { + std::set poseIdsToRemove; + std::set poseIdsToKeep; + + for (auto& viewIt : outputSfMData_selected.getPoses()) + { + const IndexT viewId = viewIt.first; + auto it = std::find(selectedPoses.begin(), selectedPoses.end(), viewId); + if (it == selectedPoses.end()) + { + poseIdsToRemove.insert(viewId); + } + else + { + poseIdsToKeep.insert(viewId); + } + } + + for (auto r : poseIdsToRemove) + { + outputSfMData_selected.getPoses().erase(r); + } + + for (auto r : poseIdsToKeep) + { + outputSfMData_unselected.getPoses().erase(r); + } + } + ALICEVISION_LOG_INFO("Save into '" << outputSfMFilenameSelected << "'"); // Export the SfMData scene in the expected format From 7ef926aa75868fa06bc9ad6cd41e108576d91df7 Mon Sep 17 00:00:00 2001 From: Alice Sonolet Date: Tue, 29 Jul 2025 11:09:16 +0200 Subject: [PATCH 2/3] [node] sfmFiltter : rename variables --- src/software/utils/main_sfmFilter.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/software/utils/main_sfmFilter.cpp b/src/software/utils/main_sfmFilter.cpp index 9c8afe4ad0..9c0015ee28 100644 --- a/src/software/utils/main_sfmFilter.cpp +++ b/src/software/utils/main_sfmFilter.cpp @@ -123,17 +123,17 @@ int aliceVision_main(int argc, char** argv) std::set poseIdsToRemove; std::set poseIdsToKeep; - for (auto& viewIt : outputSfMData_selected.getPoses()) + for (auto& poseIt : outputSfMData_selected.getPoses()) { - const IndexT viewId = viewIt.first; - auto it = std::find(selectedPoses.begin(), selectedPoses.end(), viewId); + const IndexT poseId = poseIt.first; + auto it = std::find(selectedPoses.begin(), selectedPoses.end(), poseId); if (it == selectedPoses.end()) { - poseIdsToRemove.insert(viewId); + poseIdsToRemove.insert(poseId); } else { - poseIdsToKeep.insert(viewId); + poseIdsToKeep.insert(poseId); } } From 97e81bb6d13f0f4e34b80e41851259859289dd6f Mon Sep 17 00:00:00 2001 From: Alice Sonolet Date: Tue, 29 Jul 2025 16:22:57 +0200 Subject: [PATCH 3/3] =?UTF-8?q?[node]=C2=A0smfFilter=20:=20update=20versio?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- meshroom/aliceVision/SfMFilter.py | 2 +- src/software/utils/main_sfmFilter.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/meshroom/aliceVision/SfMFilter.py b/meshroom/aliceVision/SfMFilter.py index b53c015363..c978883ed1 100644 --- a/meshroom/aliceVision/SfMFilter.py +++ b/meshroom/aliceVision/SfMFilter.py @@ -1,4 +1,4 @@ -__version__ = "1.0" +__version__ = "1.1" from meshroom.core import desc from meshroom.core.utils import VERBOSE_LEVEL diff --git a/src/software/utils/main_sfmFilter.cpp b/src/software/utils/main_sfmFilter.cpp index 9c0015ee28..f23d62b186 100644 --- a/src/software/utils/main_sfmFilter.cpp +++ b/src/software/utils/main_sfmFilter.cpp @@ -21,7 +21,7 @@ // These constants define the current software version. // They must be updated when the command line is changed. #define ALICEVISION_SOFTWARE_VERSION_MAJOR 1 -#define ALICEVISION_SOFTWARE_VERSION_MINOR 0 +#define ALICEVISION_SOFTWARE_VERSION_MINOR 1 using namespace aliceVision; using namespace aliceVision::sfm;