这篇文章回答以下问题:
**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优化代码..*/
}
可以总结这个重三角化的大致计算流程如下:
-
设置最大三角化误差为5.0
-
对于每个图像对,只在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中的两种重三角化技术,包括全局BA前后的实现细节。通过对比分析,揭示了这两种方法如何提高三维重建的完整性和准确性。
最低0.47元/天 解锁文章
827

被折叠的 条评论
为什么被折叠?



