Colmap是一个集成了Incremental Sfm和Multi View Stereo的库,可以从输入图像集计算,依次得到稀疏点云、稠密点云和三维表面。由sfm方法得到稀疏重建后,稠密重建需要CUDA支持。
稀疏重建算法流程和一般的增量式sfm类似:
特征点提取(cuda支持下可使用SIFTGPU)
匹配,序列不同可以选择不同匹配策略
用两帧初始化开始增量式重建
重建一定数量序列,做Bundle Adjustment
作者的改进参考论文:《Structure from motion revisited》
稠密重建部分包括
求深度图和表面向量,使用改进的pactchMatch方法,基于cuda实现。
算法见论文:
《Pixelwise View Selection for Unstructured Multi-View Stereo》
混合(Fusion),大致理解是第一步求出的深度图和表面向量和稀疏点云混合。这时候得到的点云,已经非常密集了。
表面重建,Poisson方法和Delaunay方法。后者直接使用了CGAL中的函数。官方文档推荐先做Delaunay在做Poisson,因为Poisson对噪声比较敏感。
colmap官方文档: https://colmap.github.io/index.html
作者给出的windows下Colmap的安装方法,看起来很简单,只需要cmd一条命令就可以实现Colmap Release版本的编译·,实现软件的安装。
但是我在实际操作中,会遇到很多问题,比如网络问题,依赖库版本问题,这都会导致最终Colmap的安装失败。下面的问题是安装过程中遇到了,提供的解决方法,希望可以给读者带来一些参考。
boost编译安装还是比较简单的。找到boost网站,下载boost的源代码。也有预编译好的版本,但是似乎只有静态链接的库,如libboost__xxxx.lib。建议还是自己编译一遍,方便其它工程使用,也是为了避免下面提到colmap安装的一个问题。
解压后的boost代码包如下,找到bootstrap.bat,运行后生成b2.exe。
下面是安装步骤
prefix就是boost安装目录,按照自己喜欢修改,默认是在C:\boost;
从上图出现的一系列中,找到buildtype,输入complete。这样会同时生成libboost_xxxx.lib,boost_xxxlib和对应dll。
按照正确格式输入: .\b2 prefix=xx目录 --build-type=complete install
等待大概几十分钟,编译和复制需要较长时间。
推荐方法使用脚本自动安装的方法,是在线下载colmap依赖的几个库。如果网络受限,比如不能下载慢,py文件中url无效,都没法正常安装,有时候等待很长时间,或者出现下图的报错:
所以如果有这些库的源代码,直接放在py中指定的文件夹。
打开build.py,其实它的功能就是下载库,解压,移动到__ install__文件夹中,然后cmake编译生成安装。无法下载,我们可以注释掉py文件中下载解压部分,直接开始编译安装,只要修改好py中对应的名字,即可。
使用build.py自动编译glew,还会出现以上报错。打开glew的sln,在debug下,打开glew_s的属性管理器–》附加依赖项-》添加msvcrt.lib,重新生成项目即可。
问题大同小异,可以参考我另外一篇博客。如果build.py出了问题,单独编译suiteparse和ceres也可以,但是注意要把生成的include和lib安装到.py中要求的文件夹中。
如果其它依赖库都安装完成,编译colmap时报这个错误,这是由于cmake无法找到boost导致的,有各种解决办法,包括手动编译boost的。下面提供两种解决方法,测试过有效:(原理大同小异,按个人习惯选择)
手动编译colmap。用cmake编译colmap,在gui中添加colmap所需boost几个库和头文件。
在colmap的cmakelist中设置boost的目录,包括cmake目录和包含,如下所示:
set(Boost_DIR "C:/Boost/lib/cmake/Boost-1.72.0")
set(Boost_INCLUDE_DIR "C:/Boost/include")
前面都编译成功了,colmap静态库也生成了,开始链接,生成exe文件,出现下面报错:
colmap.lib(dense_reconstruction_widget.obj) : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) void __cdecl boost::filesystem::path_traits::convert(char const *,char const *,class std::basic_string,class std::allocator > &,class std::codecvt const &)" (__imp_?
**原因:**未知。同样的方法,在vs2017中未出现,vs2019编译就出问题,可能是编译器导致
解决办法:手动打开colmap工程,将colmap_exe工程的release下附加依赖项关于boost相关的 libboost_xxx全部修改为boost_xxx。直接用vs生成该项目,继续在py文件中注释一些函数,运行py把一些依赖的项复制好。
编译cuda一起,报错版本不支持,打开报错文件是:host_config.h。
找到报错地方,是一个对vs版本判断,粗暴去除对于vs版本限制,编译无问题。后续的colmap的cuda功能也不受影响。
为什么敢修改?因为之前用cuda做三方库,vs2019编译时,没报这个错误,觉得没有影响。后面证实确实没有影响。
找到install文件夹下,colmap.bat,运行colmap。下图为稀疏重建结果。
测试过稠密重建,stereo没有问题,poisson也可以,但是delaunay表面重建失败,还没有找原因。
如果需要稠密重建,看效果的读者,记得按照官方手册的一些tips修改参数。