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
2727using namespace aliceVision ;
@@ -355,7 +355,7 @@ bool fromLandmarksMerge(sfmData::SfMData & sfmData1, const sfmData::SfMData & sf
355355int 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