Skip to content

Commit d9d6a44

Browse files
authored
Merge pull request #1807 from alicevision/dev/sfmMultiMerge
Enable merging of multiple sfms
2 parents c5be0c4 + 2eac9de commit d9d6a44

File tree

1 file changed

+49
-37
lines changed

1 file changed

+49
-37
lines changed

src/software/utils/main_sfmMerge.cpp

Lines changed: 49 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
// These constants define the current software version.
2323
// They must be updated when the command line is changed.
24-
#define ALICEVISION_SOFTWARE_VERSION_MAJOR 2
24+
#define ALICEVISION_SOFTWARE_VERSION_MAJOR 3
2525
#define ALICEVISION_SOFTWARE_VERSION_MINOR 0
2626

2727
using namespace aliceVision;
@@ -355,7 +355,7 @@ bool fromLandmarksMerge(sfmData::SfMData & sfmData1, const sfmData::SfMData & sf
355355
int aliceVision_main(int argc, char** argv)
356356
{
357357
// command-line parameters
358-
std::string sfmDataFilename1, sfmDataFilename2;
358+
std::vector<std::string> sfmDataFilenames;
359359
std::string outSfMDataFilename;
360360
EMergeMethod mergeMethod = EMergeMethod::SIMPLE_COPY;
361361
std::vector<std::string> matchesFolders;
@@ -364,10 +364,8 @@ int aliceVision_main(int argc, char** argv)
364364
// clang-format off
365365
po::options_description requiredParams("Required parameters");
366366
requiredParams.add_options()
367-
("firstinput,i1", po::value<std::string>(&sfmDataFilename1)->required(),
368-
"First SfMData file to merge.")
369-
("secondinput,i2", po::value<std::string>(&sfmDataFilename2)->required(),
370-
"Second SfMData file to merge.")
367+
("inputs,i", po::value<std::vector<std::string>>(&sfmDataFilenames)->multitoken(),
368+
"Path to sfmDatas to merge.")
371369
("output,o", po::value<std::string>(&outSfMDataFilename)->required(),
372370
"Output SfMData scene.");
373371

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

394-
// Load input scene
395-
sfmData::SfMData sfmData1;
396-
if (!sfmDataIO::load(sfmData1, sfmDataFilename1, sfmDataIO::ESfMData::ALL))
392+
if (sfmDataFilenames.empty())
397393
{
398-
ALICEVISION_LOG_ERROR("The input SfMData file '" << sfmDataFilename1 << "' cannot be read");
394+
ALICEVISION_LOG_ERROR("At least one sfmData input should be given.");
399395
return EXIT_FAILURE;
400396
}
401397

402-
sfmData::SfMData sfmData2;
403-
if (!sfmDataIO::load(sfmData2, sfmDataFilename2, sfmDataIO::ESfMData::ALL))
404-
{
405-
ALICEVISION_LOG_ERROR("The input SfMData file '" << sfmDataFilename2 << "' cannot be read");
406-
return EXIT_FAILURE;
407-
}
398+
sfmData::SfMData outputSfmData;
408399

409-
if (mergeMethod == EMergeMethod::SIMPLE_COPY)
400+
for (int id = 0; id < sfmDataFilenames.size(); id++)
410401
{
411-
if (!simpleMerge(sfmData1, sfmData2))
402+
const std::string & filename = sfmDataFilenames[id];
403+
ALICEVISION_LOG_INFO("Processing " << filename);
404+
405+
// Load input scene
406+
sfmData::SfMData sfmData;
407+
if (!sfmDataIO::load(sfmData, filename, sfmDataIO::ESfMData::ALL))
412408
{
409+
ALICEVISION_LOG_ERROR("The input SfMData file '" << filename << "' cannot be read");
413410
return EXIT_FAILURE;
414411
}
415-
}
416-
else
417-
{
418-
// get imageDescriber type
419-
const std::vector<feature::EImageDescriberType> describerTypes = feature::EImageDescriberType_stringToEnums(describerTypesName);
420412

421-
// matches reading
422-
matching::PairwiseMatches pairwiseMatches;
423-
if (!matching::Load(pairwiseMatches, std::set<IndexT>(), matchesFolders, describerTypes, 0, 0))
413+
if (id == 0)
424414
{
425-
std::stringstream ss("Unable to read the matches file(s) from:\n");
426-
for (const std::string& folder : matchesFolders)
415+
outputSfmData = sfmData;
416+
continue;
417+
}
418+
419+
if (mergeMethod == EMergeMethod::SIMPLE_COPY)
420+
{
421+
if (!simpleMerge(outputSfmData, sfmData))
427422
{
428-
ss << "\t- " << folder << "\n";
423+
return EXIT_FAILURE;
429424
}
430-
431-
ALICEVISION_LOG_WARNING(ss.str());
432-
433-
return EXIT_FAILURE;
434425
}
435-
436-
if (!fromLandmarksMerge(sfmData1, sfmData2, pairwiseMatches))
426+
else
437427
{
438-
return EXIT_FAILURE;
428+
// get imageDescriber type
429+
const std::vector<feature::EImageDescriberType> describerTypes = feature::EImageDescriberType_stringToEnums(describerTypesName);
430+
431+
// matches reading
432+
matching::PairwiseMatches pairwiseMatches;
433+
if (!matching::Load(pairwiseMatches, std::set<IndexT>(), matchesFolders, describerTypes, 0, 0))
434+
{
435+
std::stringstream ss("Unable to read the matches file(s) from:\n");
436+
for (const std::string& folder : matchesFolders)
437+
{
438+
ss << "\t- " << folder << "\n";
439+
}
440+
441+
ALICEVISION_LOG_WARNING(ss.str());
442+
443+
return EXIT_FAILURE;
444+
}
445+
446+
if (!fromLandmarksMerge(outputSfmData, sfmData, pairwiseMatches))
447+
{
448+
return EXIT_FAILURE;
449+
}
439450
}
440451
}
452+
441453

442-
if (!sfmDataIO::save(sfmData1, outSfMDataFilename, sfmDataIO::ESfMData::ALL))
454+
if (!sfmDataIO::save(outputSfmData, outSfMDataFilename, sfmDataIO::ESfMData::ALL))
443455
{
444456
ALICEVISION_LOG_ERROR("An error occurred while trying to save '" << outSfMDataFilename << "'");
445457
return EXIT_FAILURE;

0 commit comments

Comments
 (0)