Colmap中重三角化方法总结

本文深入探讨了Colmap中的两种重三角化技术,包括全局BA前后的实现细节。通过对比分析,揭示了这两种方法如何提高三维重建的完整性和准确性。

这篇文章回答以下问题:

**Colmap中两种重三角化是如何实现的?**

Colmap作为现在最先进,最完整的一个SFM+MVS系统,其中有很多地方值得学习和借鉴。对于其中的SFM模块,采用了大量的tricks来提高SFM重建的准确性和完整性,本文试图解释是其中之一:重三角化

本文只讨论重三角化,其在全局BA前后完成,目的是为了提高重建的完整性和准确性。主要参考资料,来自Colmap工程代码和论文《Structure from motion Revisited》。

目录

重三角化

在原论文中,有一段文字提到重三角化,其大致翻译如下:

重三角化 和VisualSFM类似,本文也使用了在全局BA前重三角化来减小漂移效应。但是,BA总是可以很好的优化相机和点的参数。因此,本文提出拓展有效的pre-BA 重三角化,增加post-BA 重三角化。目的在于提高重建的完整性,通过继续先前由于不准确的相机位姿导致三角化失败的点的追踪。我们只继续追踪哪些误差在滤波阈值下的观察点。此外,我们尝试合并追踪,因此提高下一步BA的完整性

论文中提到,重三角化可以提高重建三维点的完整性,并且减小累积误差带来的漂移。Colmap扩展了重三角化到全局BA之后,所以使用了两次重三角化。

这里听起来似乎,两种BA似乎使用同样的计算流程去计算,但是事实上并非如此。那么两种重三角化是如何实现的呢?这就需要看代码细节了。

pre-BA RT: 全局BA前的重三角化

在colmap源代码中sfm/incremental_triangulation.cc,很容易找到一个ReTriangulate函数,其在IterrativeGlobaBA(见controllers/incremental_mapper.cc)中使用,如下:

void IterativeGlobalRefinement(
const IncrementalMapperOptions& options,
IncrementalMapper* mapper) {
  PrintHeading1("Retriangulation");
  CompleteAndMergeTracks(options, mapper);
  std::cout << "  => Retriangulated observations: "
        << mapper->Retriangulate(options.Triangulation()) << std::endl;

/*..全局BA优化代码..*/ 
}

可以总结这个重三角化的大致计算流程如下:

  1. 设置最大三角化误差为5.0

  2. 对于每个图像对,只在under-reconstructed 图像对之间使用重三角化:

    已有三维点/匹配特征点匹配数量<0.2

    2.1 检测是否是under-reconstructed 图像?否则跳过

    2.2 图像是否在已经在重建中使用?否则跳过

    2.3 图像相机参数是否有问题?否则跳过

    2.4 对于每个图像对中的每个特征点匹配对

    ​ 2.4.1 **都有对应三维点?**是则跳过(无论是同一三维点/不同三维点,这里不处理后一种情况)。

    ​ 2.4.2 如果两个特征点都没有三维点,使用EstimateTriangulation (estimators/triangulate.cc),这是在论文中介绍过的采样三角化方法,在这里不解释,理解为普通三角化就好。如果误差满足(注意此处阈值为5.0),则添加该3D点和观测关系到重建中。

    ​ 2.4.3 如果其中一个特征点有对应重建三维点,设置另外一个特征点的3D点为该点,添加观测关系到重建中。

post-BA RT:全局BA后的重三角化

BA后的重三角化不是很好理解,并且在代码中也没有直接找到这样的实现。基于colmap.cc的提示,和Github上Issue#414作者本人回答,post-BA重三角化在这个函数中实现:

/////////////////////////////////////////////////////////////////////////
// Retriangulation
/////////////////////////////////////////////////////////////////////////
PrintHeading1("Retriangulation");
CompleteAndMergeTracks(mapper_options, &
### COLMAP 的合并方法 COLMAP 是一种用于结构光建模(Structure from Motion, SfM)和多视图立体视觉(Multi-View Stereo, MVS)的开源工具。它支持通过多个图像集来构建场景的三维模型,并提供了多种功能以实现高效的建过程。 #### 1. 数据准备阶段 为了进行合并建,首先需要准备好两个或更多独立的建项目文件夹。这些文件夹通常由 `database.db` 和稀疏建目录组成。每个数据库应包含一组已匹配的关键点及其对应的相机姿态信息[^1]。 ```bash # 假设有两个不同的建结果分别存储于以下路径下: reconstruction_1/ ├── database.db └── sparse/ reconstruction_2/ ├── database.db └── sparse/ ``` #### 2. 合并数据库 使用 COLMAP 提供的命令行工具可以轻松完成数据库的合并操作: ```bash colmap database_merger \ --database_path1 reconstruction_1/database.db \ --database_path2 reconstruction_2/database.db \ --output_path merged_database.db ``` 此步骤会将两组数据集中所有的特征描述符、关键点位置以及其他元数据整合到一个新的 SQLite 数据库中。 #### 3. 执行全局束调整法 (Global Bundle Adjustment) 一旦完成了初步的数据融合,则需进一步执行全局优化步骤——即所谓的“Bundle Adjustment”,从而最小化投影误差并提高整体几何精度: ```bash colmap mapper \ --database_path merged_database.db \ --image_path images/ \ --output_path merged_sparse/ ``` 这里需要注意的是 `-image_path` 参数应当指向所有参与建图片所在的公共根目录;而最终得到的结果会被保存至指定的目标文件夹内(`merged_sparse`)之中。 #### 4. 密集建与纹理映射 对于更高质量的需求来说,在获得精确可靠的稀疏点云之后还可以继续利用稠密配准算法生成表面网格以及贴图效果。具体流程如下所示: ```bash mkdir dense cd dense colmap image_undistorter \ --image_path ../images/ \ --input_path ../sparse/ \ --output_path . colmap patch_match_stereo ... colmap stereo_fusion ... ``` 以上脚本片段展示了如何基于先前计算所得的信息创建详细的三角形面片集合,并将其转换成适合渲染引擎使用的格式。 --- ### 边缘化处理及相关概念补充说明 当涉及到大规模 SLAM 或者 SFM 场景下的增量式更新时,“边缘化”便成为了一个非常要的环节之一。其核心思想在于通过对旧状态变量实施降维压缩后再引入新观测值来进行联合估计,以此达到减少内存占用量的目的同时维持较高的数值稳定性[^2]。 假设我们拥有一个完整的 Hessian 矩阵 \( \mathbf{H} \),其中包含了关于当前时刻全部未知数的一阶偏导项平方加权累加之和形式表达出来的二阶近似曲率特性描述。那么针对某一部分选定子集内的元素而言,可以通过应用舒尔补公式有效地剔除掉其余无关紧要的部分贡献成分,进而获取简化版的新目标函数定义域范围表示方式: \[ \begin{aligned} &\text { Given } \quad[\mathrm{H}]_{n+m}= \\ &\left(\begin{array}{cc} A & B^{T} \\ B & C \end{array}\right),\\ &\text { Schur complement of block A is defined as:}\\ &S=C-B * inv(A)*B^{T}. \end{aligned} \] 上述关系揭示了如何从原始复杂体系当中提取出特定关注区域内部相互作用规律的方法论基础理论依据所在之处。 最后一步则是考虑怎样把这些经过预处理后的先验约束条件新融入后续迭代过程中去完善整个系统的动态演化轨迹规划方案设计思路框架搭建起来的工作内容安排事项方面做出合理解释说明清楚明白易懂即可满足实际应用场景需求标准水平线之上表现良好性能指标达成预期成果验收合格为止结束本次讨论交流分享活动总结报告撰写完毕提交审核批准发布上线运营维护管理技术支持服务保障措施落实到位无误方可正式投入使用运行环境部署配置调试测试验证确认安全可靠稳定高效便捷实用性强用户体验佳口碑好市场竞争力强品牌价值高经济效益显著社会效益明显综合效益最大化最优解最佳实践案例示范引领带动效应广泛传播推广普及应用前景广阔未来发展潜力巨大不可限量值得期待看好长期投资回报丰厚可观收益颇丰利润空间充足可持续发展能力强生命力旺盛活力四射充满希望光明未来可期! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值