(SfM三维重建一)Colmap使用体验

使用图像进行三维重建,Colmap应该是比较常使用的软件,因为是开源的,所以也可以根据自己需求获取很多中间数据,实现一些小功能。它集成了SfM和MVS两个部分,所以输入图像后,可直接进行图像匹配->稀疏重建->稠密重建->网格重建,一套流程。并且提供图形化界面,因此之前很多的重建实验都用它完成。个人感觉其重建效果还是比较理想的,且比openSfM,openMVG等工具使用起来更方便。

一.环境配置+安装

基本按照Gitlab上的配置说明就行,百度其他人的流程也可。配置环境比较简单,不过有几次编译到99%会报错,记不太清错误是什么了,大致是与之前的anaconda环境冲突,在~/.bashrc中注释掉就行。

二.运行

一般就colmap gui打开图形化界面就行。除非是需要某些特殊的中间结果,需要使用到命令行。

(SfM三维重建一)Colmap使用体验_第1张图片

界面比较简介,先创建新数据集,选择图像文件夹,然后在Processing中按顺序选特征提取,特征匹配。

1.特征提取

如果是相机拍的图像,可以选择从EXIF提取相机参数,其他情况下让它自己估计一个就行,在之后的过程会自动更正。

2.特征匹配

matching这个阶段很重要,匹配方式不同会对最终结果影响很大,要根据实际情况选择合适的匹配方式。图形界面特征匹配有以下几种方式——

(SfM三维重建一)Colmap使用体验_第2张图片

  1. Exhaustive——官方文档中说明Exhaustive耗时最长,因为所有图像都会两两匹配,但理论上效果最好。但在实际操作过程中发现很多时候这种方式耗时长而且效果也不好,尤其是当场景很相似时会集中在一团,例如建筑的四个面都很像,这时匹配后会认为只拍到了一个面,其他三面都重建不出来。
  2. Sequential——这种方式我使用了挺长时间,因为一般去采集图像时,都是按时序去采集,甚至直接从视频提取帧(ffmpeg很好用!),因此使用这种匹配方式,选择相邻x张图像匹配,往往效果会比较好,像上面的问题就不会遇到。但是它也会有其他的问题,比如在拍摄开始和拍摄结束,都拍摄的同一个物体,但由于误差累计,可能会重建出两个一模一样的(只是会有些偏差)。
  3. Spatial——这种方式是利用了地理位置信息,也就是每张图像必须自带位置信息,例如gps。这种方式需要设置在多大范围内进行匹配,因此需要事先知道大概重建场景大小,以便选择合适参数。
  4. Custom——这种就是自定义。一开始我觉得这种方式很傻,不智能,所以从没用过。但是在试了前面几种方法,效果还是不理想,怀疑人生的时候,我发现可以自己去定义哪几张图像匹配哪几张不匹配,最后简直有奇效!!!所以这种方式适合很清楚自己的数据是怎么来的,有一定先验后去制定匹配方式。总之这几种方式都各有优劣,按照实际情况选择就行。
  5. Hierachical——这好像是只有命令行才有的匹配方式,图形界面还没有加上去。这是针对大场景,图像数量很多时,会自动分成几个部分并行计算,最后拼在一起。然而试了下貌似效果并不是很理想,github上也说会在后续改进,目前只是一个初步的功能。

3.稀疏重建

Reconstruction->Start reconstruction就行了,参数设置我一般没咋变,重建完后就可以看到界面显示红色的相机位姿和稀疏的点云,这一步为止就是SfM的步骤。如果效果很不好,则重新考虑匹配方式。

4.稠密重建

Reconstruction->Dense reconstruction,这之后就是MVS的内容了,也是计算量大,耗时最长的步骤。选择输出文件夹后,按顺序undistortion对每个图像去畸,Stereo(这一步耗时很长)三角测量计算每个像素的深度,Fusion将所有点云融合,这就可以得到稠密的点云了,MVS的内容也就结束了。重建后的点云在colmap可视化还不错,用meshlab显示的话效果不佳。

在这之后还可用Poisson进行mesh重建,得到有颜色的mesh模型。或者Delaunay得到没有纹理的mesh模型。个人感觉Delaunay的质量会好一些。

最后值得一提的是,Colmap重建出的模型,纹理很一般。在看它的源码时发现,它对纹理就没有过多的计算,比较简单粗暴,因此可视化效果一般,后续可能用其他纹理映射方法改善效果。但几何重建这一块已经不错了,对比许多商业软件也不输。

你可能感兴趣的:(三维重建,经验分享)