Skip to content

Commit

Permalink
Merge pull request #1807 from alicevision/dev/sfmMultiMerge
Browse files Browse the repository at this point in the history
Enable merging of multiple sfms
  • Loading branch information
fabiencastan authored Jan 27, 2025
2 parents c5be0c4 + 2eac9de commit d9d6a44
Showing 1 changed file with 49 additions and 37 deletions.
86 changes: 49 additions & 37 deletions src/software/utils/main_sfmMerge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 2
#define ALICEVISION_SOFTWARE_VERSION_MAJOR 3
#define ALICEVISION_SOFTWARE_VERSION_MINOR 0

using namespace aliceVision;
Expand Down Expand Up @@ -355,7 +355,7 @@ bool fromLandmarksMerge(sfmData::SfMData & sfmData1, const sfmData::SfMData & sf
int aliceVision_main(int argc, char** argv)
{
// command-line parameters
std::string sfmDataFilename1, sfmDataFilename2;
std::vector<std::string> sfmDataFilenames;
std::string outSfMDataFilename;
EMergeMethod mergeMethod = EMergeMethod::SIMPLE_COPY;
std::vector<std::string> matchesFolders;
Expand All @@ -364,10 +364,8 @@ int aliceVision_main(int argc, char** argv)
// clang-format off
po::options_description requiredParams("Required parameters");
requiredParams.add_options()
("firstinput,i1", po::value<std::string>(&sfmDataFilename1)->required(),
"First SfMData file to merge.")
("secondinput,i2", po::value<std::string>(&sfmDataFilename2)->required(),
"Second SfMData file to merge.")
("inputs,i", po::value<std::vector<std::string>>(&sfmDataFilenames)->multitoken(),
"Path to sfmDatas to merge.")
("output,o", po::value<std::string>(&outSfMDataFilename)->required(),
"Output SfMData scene.");

Expand All @@ -391,55 +389,69 @@ int aliceVision_main(int argc, char** argv)
return EXIT_FAILURE;
}

// Load input scene
sfmData::SfMData sfmData1;
if (!sfmDataIO::load(sfmData1, sfmDataFilename1, sfmDataIO::ESfMData::ALL))
if (sfmDataFilenames.empty())
{
ALICEVISION_LOG_ERROR("The input SfMData file '" << sfmDataFilename1 << "' cannot be read");
ALICEVISION_LOG_ERROR("At least one sfmData input should be given.");
return EXIT_FAILURE;
}

sfmData::SfMData sfmData2;
if (!sfmDataIO::load(sfmData2, sfmDataFilename2, sfmDataIO::ESfMData::ALL))
{
ALICEVISION_LOG_ERROR("The input SfMData file '" << sfmDataFilename2 << "' cannot be read");
return EXIT_FAILURE;
}
sfmData::SfMData outputSfmData;

if (mergeMethod == EMergeMethod::SIMPLE_COPY)
for (int id = 0; id < sfmDataFilenames.size(); id++)
{
if (!simpleMerge(sfmData1, sfmData2))
const std::string & filename = sfmDataFilenames[id];
ALICEVISION_LOG_INFO("Processing " << filename);

// Load input scene
sfmData::SfMData sfmData;
if (!sfmDataIO::load(sfmData, filename, sfmDataIO::ESfMData::ALL))
{
ALICEVISION_LOG_ERROR("The input SfMData file '" << filename << "' cannot be read");
return EXIT_FAILURE;
}
}
else
{
// get imageDescriber type
const std::vector<feature::EImageDescriberType> describerTypes = feature::EImageDescriberType_stringToEnums(describerTypesName);

// matches reading
matching::PairwiseMatches pairwiseMatches;
if (!matching::Load(pairwiseMatches, std::set<IndexT>(), matchesFolders, describerTypes, 0, 0))
if (id == 0)
{
std::stringstream ss("Unable to read the matches file(s) from:\n");
for (const std::string& folder : matchesFolders)
outputSfmData = sfmData;
continue;
}

if (mergeMethod == EMergeMethod::SIMPLE_COPY)
{
if (!simpleMerge(outputSfmData, sfmData))
{
ss << "\t- " << folder << "\n";
return EXIT_FAILURE;
}

ALICEVISION_LOG_WARNING(ss.str());

return EXIT_FAILURE;
}

if (!fromLandmarksMerge(sfmData1, sfmData2, pairwiseMatches))
else
{
return EXIT_FAILURE;
// get imageDescriber type
const std::vector<feature::EImageDescriberType> describerTypes = feature::EImageDescriberType_stringToEnums(describerTypesName);

// matches reading
matching::PairwiseMatches pairwiseMatches;
if (!matching::Load(pairwiseMatches, std::set<IndexT>(), matchesFolders, describerTypes, 0, 0))
{
std::stringstream ss("Unable to read the matches file(s) from:\n");
for (const std::string& folder : matchesFolders)
{
ss << "\t- " << folder << "\n";
}

ALICEVISION_LOG_WARNING(ss.str());

return EXIT_FAILURE;
}

if (!fromLandmarksMerge(outputSfmData, sfmData, pairwiseMatches))
{
return EXIT_FAILURE;
}
}
}


if (!sfmDataIO::save(sfmData1, outSfMDataFilename, sfmDataIO::ESfMData::ALL))
if (!sfmDataIO::save(outputSfmData, outSfMDataFilename, sfmDataIO::ESfMData::ALL))
{
ALICEVISION_LOG_ERROR("An error occurred while trying to save '" << outSfMDataFilename << "'");
return EXIT_FAILURE;
Expand Down

0 comments on commit d9d6a44

Please sign in to comment.