colmap增量代码
稀疏重建入口
# RunSparseMapper
void AutomaticReconstructionController::RunSparseMapper() {
const auto sparse_path = JoinPaths(options_.workspace_path, "sparse");
if (ExistsDir(sparse_path)) {
auto dir_list = GetDirList(sparse_path);
std::sort(dir_list.begin(), dir_list.end());
if (dir_list.size() > 0) {
std::cout << std::endl
<< "WARNING: Skipping sparse reconstruction because it is "
"already computed"
<< std::endl;
for (const auto& dir : dir_list) {
reconstruction_manager_->Read(dir);
}
return;
}
}
IncrementalMapperController mapper(
option_manager_.mapper.get(), *option_manager_.image_path,
*option_manager_.database_path, reconstruction_manager_);
active_thread_ = &mapper;
mapper.Start();
mapper.Wait();
active_thread_ = nullptr;
CreateDirIfNotExists(sparse_path);
reconstruction_manager_->Write(sparse_path, &option_manager_);
}
Image
与另一幅图像至少有一个对应关系的 2D 点数。num_observations
与其它图像的关联总数num_correspondences
图像的每个特征点都有一个vector,由于存放与该特征点匹配的track(image_id, point2D_id)
std::vector<std::vector<Correspondence>> corrs;
遍历所有的边,更新corrs
# FindNext
将所有未注册的图像,按照某种得分策略排序
- 图像的可见3D点,2D-3D关联
- 图像的可见3D点比率
- 论文中的next best view策略
vector<image_t> next_images
# RegisterNextImage
遍历vector<image_t> next_images
,如果成功了就break
寻找2D-3D点的关联
# EstimateAbsolutePose
对于不同的focal_length_factors,都进行一次位姿估计,最终选择内点数最多的估计
# RefineAbsolutePose
对当前帧观测到的3D点进行BA一次
# TriangulateImage
生成新的观测
# IterativeLocalRefinement
对改变了的观测进行一次BA
# IterativeGlobalRefinement
如果模型增长一定比率,则进行全局BA
对已经配准的图像对,重新进行一次三角化