// Copyright (c) 2022, ETH Zurich and UNC Chapel Hill. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // * Neither the name of ETH Zurich and UNC Chapel Hill nor the names of // its contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Author: Johannes L. Schoenberger (jsch-at-demuc-dot-de) #include "exe/database.h" #include "exe/feature.h" #include "exe/gui.h" #include "exe/image.h" #include "exe/model.h" #include "exe/mvs.h" #include "exe/sfm.h" #include "exe/vocab_tree.h" #include "util/version.h" namespace { typedef std::function command_func_t; int ShowHelp( const std::vector>& commands) { using namespace colmap; std::cout << StringPrintf( "%s -- Structure-from-Motion and Multi-View Stereo\n" " (%s)", GetVersionInfo().c_str(), GetBuildInfo().c_str()) << std::endl << std::endl; std::cout << "Usage:" << std::endl; std::cout << " colmap [command] [options]" << std::endl << std::endl; std::cout << "Documentation:" << std::endl; std::cout << " https://colmap.github.io/" << std::endl << std::endl; std::cout << "Example usage:" << std::endl; std::cout << " colmap help [ -h, --help ]" << std::endl; std::cout << " colmap gui" << std::endl; std::cout << " colmap gui -h [ --help ]" << std::endl; std::cout << " colmap automatic_reconstructor -h [ --help ]" << std::endl; std::cout << " colmap automatic_reconstructor --image_path IMAGES " "--workspace_path WORKSPACE" << std::endl; std::cout << " colmap feature_extractor --image_path IMAGES --database_path " "DATABASE" << std::endl; std::cout << " colmap exhaustive_matcher --database_path DATABASE" << std::endl; std::cout << " colmap mapper --image_path IMAGES --database_path DATABASE " "--output_path MODEL" << std::endl; std::cout << " ..." << std::endl << std::endl; std::cout << "Available commands:" << std::endl; std::cout << " help" << std::endl; for (const auto& command : commands) { std::cout << " " << command.first << std::endl; } std::cout << std::endl; return EXIT_SUCCESS; } } // namespace int main(int argc, char** argv) { using namespace colmap; InitializeGlog(argv); #ifdef GUI_ENABLED Q_INIT_RESOURCE(resources); #endif std::vector> commands; commands.emplace_back("gui", &RunGraphicalUserInterface); commands.emplace_back("automatic_reconstructor", &RunAutomaticReconstructor); commands.emplace_back("bundle_adjuster", &RunBundleAdjuster); commands.emplace_back("color_extractor", &RunColorExtractor); commands.emplace_back("database_cleaner", &RunDatabaseCleaner); commands.emplace_back("database_creator", &RunDatabaseCreator); commands.emplace_back("database_merger", &RunDatabaseMerger); commands.emplace_back("delaunay_mesher", &RunDelaunayMesher); commands.emplace_back("exhaustive_matcher", &RunExhaustiveMatcher); commands.emplace_back("feature_extractor", &RunFeatureExtractor); commands.emplace_back("feature_importer", &RunFeatureImporter); commands.emplace_back("hierarchical_mapper", &RunHierarchicalMapper); commands.emplace_back("image_deleter", &RunImageDeleter); commands.emplace_back("image_filterer", &RunImageFilterer); commands.emplace_back("image_rectifier", &RunImageRectifier); commands.emplace_back("image_registrator", &RunImageRegistrator); commands.emplace_back("image_undistorter", &RunImageUndistorter); commands.emplace_back("image_undistorter_standalone", &RunImageUndistorterStandalone); commands.emplace_back("mapper", &RunMapper); commands.emplace_back("matches_importer", &RunMatchesImporter); commands.emplace_back("model_aligner", &RunModelAligner); commands.emplace_back("model_analyzer", &RunModelAnalyzer); commands.emplace_back("model_comparer", &RunModelComparer); commands.emplace_back("model_converter", &RunModelConverter); commands.emplace_back("model_cropper", &RunModelCropper); commands.emplace_back("model_merger", &RunModelMerger); commands.emplace_back("model_orientation_aligner", &RunModelOrientationAligner); commands.emplace_back("model_splitter", &RunModelSplitter); commands.emplace_back("model_transformer", &RunModelTransformer); commands.emplace_back("patch_match_stereo", &RunPatchMatchStereo); commands.emplace_back("point_filtering", &RunPointFiltering); commands.emplace_back("point_triangulator", &RunPointTriangulator); commands.emplace_back("poisson_mesher", &RunPoissonMesher); commands.emplace_back("project_generator", &RunProjectGenerator); commands.emplace_back("rig_bundle_adjuster", &RunRigBundleAdjuster); commands.emplace_back("sequential_matcher", &RunSequentialMatcher); commands.emplace_back("spatial_matcher", &RunSpatialMatcher); commands.emplace_back("stereo_fusion", &RunStereoFuser); commands.emplace_back("transitive_matcher", &RunTransitiveMatcher); commands.emplace_back("vocab_tree_builder", &RunVocabTreeBuilder); commands.emplace_back("vocab_tree_matcher", &RunVocabTreeMatcher); commands.emplace_back("vocab_tree_retriever", &RunVocabTreeRetriever); if (argc == 1) { return ShowHelp(commands); } const std::string command = argv[1]; if (command == "help" || command == "-h" || command == "--help") { return ShowHelp(commands); } else { command_func_t matched_command_func = nullptr; for (const auto& command_func : commands) { if (command == command_func.first) { matched_command_func = command_func.second; break; } } if (matched_command_func == nullptr) { std::cerr << StringPrintf( "ERROR: Command `%s` not recognized. To list the " "available commands, run `colmap help`.", command.c_str()) << std::endl; return EXIT_FAILURE; } else { int command_argc = argc - 1; char** command_argv = &argv[1]; command_argv[0] = argv[0]; return matched_command_func(command_argc, command_argv); } } return ShowHelp(commands); }