ceres-solver-v1 / colmap /src /controllers /incremental_mapper.h
camenduru's picture
ceres-solver and colmap
7b7496d
// 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)
#ifndef COLMAP_SRC_CONTROLLERS_INCREMENTAL_MAPPER_H_
#define COLMAP_SRC_CONTROLLERS_INCREMENTAL_MAPPER_H_
#include "base/reconstruction_manager.h"
#include "sfm/incremental_mapper.h"
#include "util/threading.h"
namespace colmap {
struct IncrementalMapperOptions {
public:
// The minimum number of matches for inlier matches to be considered.
int min_num_matches = 15;
// Whether to ignore the inlier matches of watermark image pairs.
bool ignore_watermarks = false;
// Whether to reconstruct multiple sub-models.
bool multiple_models = true;
// The number of sub-models to reconstruct.
int max_num_models = 50;
// The maximum number of overlapping images between sub-models. If the
// current sub-models shares more than this number of images with another
// model, then the reconstruction is stopped.
int max_model_overlap = 20;
// The minimum number of registered images of a sub-model, otherwise the
// sub-model is discarded.
int min_model_size = 10;
// The image identifiers used to initialize the reconstruction. Note that
// only one or both image identifiers can be specified. In the former case,
// the second image is automatically determined.
int init_image_id1 = -1;
int init_image_id2 = -1;
// The number of trials to initialize the reconstruction.
int init_num_trials = 200;
// Whether to extract colors for reconstructed points.
bool extract_colors = true;
// The number of threads to use during reconstruction.
int num_threads = -1;
// Thresholds for filtering images with degenerate intrinsics.
double min_focal_length_ratio = 0.1;
double max_focal_length_ratio = 10.0;
double max_extra_param = 1.0;
// Which intrinsic parameters to optimize during the reconstruction.
bool ba_refine_focal_length = true;
bool ba_refine_principal_point = false;
bool ba_refine_extra_params = true;
// The minimum number of residuals per bundle adjustment problem to
// enable multi-threading solving of the problems.
int ba_min_num_residuals_for_multi_threading = 50000;
// The number of images to optimize in local bundle adjustment.
int ba_local_num_images = 6;
// Ceres solver function tolerance for local bundle adjustment
double ba_local_function_tolerance = 0.0;
// The maximum number of local bundle adjustment iterations.
int ba_local_max_num_iterations = 25;
// Whether to use PBA in global bundle adjustment.
bool ba_global_use_pba = false;
// The GPU index for PBA bundle adjustment.
int ba_global_pba_gpu_index = -1;
// The growth rates after which to perform global bundle adjustment.
double ba_global_images_ratio = 1.1;
double ba_global_points_ratio = 1.1;
int ba_global_images_freq = 500;
int ba_global_points_freq = 250000;
// Ceres solver function tolerance for global bundle adjustment
double ba_global_function_tolerance = 0.0;
// The maximum number of global bundle adjustment iterations.
int ba_global_max_num_iterations = 50;
// The thresholds for iterative bundle adjustment refinements.
int ba_local_max_refinements = 2;
double ba_local_max_refinement_change = 0.001;
int ba_global_max_refinements = 5;
double ba_global_max_refinement_change = 0.0005;
// Path to a folder with reconstruction snapshots during incremental
// reconstruction. Snapshots will be saved according to the specified
// frequency of registered images.
std::string snapshot_path = "";
int snapshot_images_freq = 0;
// Which images to reconstruct. If no images are specified, all images will
// be reconstructed by default.
std::unordered_set<std::string> image_names;
// If reconstruction is provided as input, fix the existing image poses.
bool fix_existing_images = false;
IncrementalMapper::Options Mapper() const;
IncrementalTriangulator::Options Triangulation() const;
BundleAdjustmentOptions LocalBundleAdjustment() const;
BundleAdjustmentOptions GlobalBundleAdjustment() const;
ParallelBundleAdjuster::Options ParallelGlobalBundleAdjustment() const;
bool Check() const;
private:
friend class OptionManager;
friend class MapperGeneralOptionsWidget;
friend class MapperTriangulationOptionsWidget;
friend class MapperRegistrationOptionsWidget;
friend class MapperInitializationOptionsWidget;
friend class MapperBundleAdjustmentOptionsWidget;
friend class MapperFilteringOptionsWidget;
friend class ReconstructionOptionsWidget;
IncrementalMapper::Options mapper;
IncrementalTriangulator::Options triangulation;
};
// Class that controls the incremental mapping procedure by iteratively
// initializing reconstructions from the same scene graph.
class IncrementalMapperController : public Thread {
public:
enum {
INITIAL_IMAGE_PAIR_REG_CALLBACK,
NEXT_IMAGE_REG_CALLBACK,
LAST_IMAGE_REG_CALLBACK,
};
IncrementalMapperController(const IncrementalMapperOptions* options,
const std::string& image_path,
const std::string& database_path,
ReconstructionManager* reconstruction_manager);
private:
void Run();
bool LoadDatabase();
void Reconstruct(const IncrementalMapper::Options& init_mapper_options);
const IncrementalMapperOptions* options_;
const std::string image_path_;
const std::string database_path_;
ReconstructionManager* reconstruction_manager_;
DatabaseCache database_cache_;
};
// Globally filter points and images in mapper.
size_t FilterPoints(const IncrementalMapperOptions& options,
IncrementalMapper* mapper);
size_t FilterImages(const IncrementalMapperOptions& options,
IncrementalMapper* mapper);
// Globally complete and merge tracks in mapper.
size_t CompleteAndMergeTracks(const IncrementalMapperOptions& options,
IncrementalMapper* mapper);
} // namespace colmap
#endif // COLMAP_SRC_CONTROLLERS_INCREMENTAL_MAPPER_H_