COLMAP安装

官方文档:

  • https://colmap.github.io/install.html

本文总结从源码编译 COLMAP 的详细步骤。如果只想用 COLMAP 可执行程序(支持全平台 Windows, Linux, MacOS),那直接下载安装即可,无难度。

Windows 中安装 COLMAP

其实可以用官方文档推荐的使用 vcpkg 安装,但是它似乎只能下载所有的第三方库然后编译,不知道如何使用本机已经安装的库(其实我不是很会用),而且速度很慢。所以这里总结一下使用 build script 安装的方法。

安装依赖库

需要提前安装的依赖库有:

  • boost
  • Qt5
  • CUDA
  • CGAL

这几个库在 Windows 下安装都不难,网上都提供了 exe 的安装文件,按要求安装即可。可以参考另一篇文档 “CGAL 安装”(cgal.md),它介绍了 Qt5, boost 和 CGAL 的安装和配置方法。CUDA 版本选择支持本机显卡的版本(比较新的显卡不支持老版本的CUDA)。

编译 COLMAP

首先从官网 repo 下载最新代码:

git clone https://github.com/colmap/colmap.git

打开 PowerShell 终端,进入 colmap 根目录下。使用如下命令,调用 build.py开始编译:

python scripts/python/build.py --build_path "C:/dev/colmap/build" --colmap_path "C:/dev/colmap" --boost_path "C:/dev/boost_1_72_0/build/lib" --qt_path "C:/Qt/Qt5.14.2/5.14.2/msvc2017_64" --cuda_path "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.2" --cgal_path "C:/dev/CGAL-5.1.2" --cmake_generator "Visual Studio 16"

其中:

  • –build_path 是编译目录;
  • –colmap_path 是包含 CMakeLists.txt 的 COLMAP 根目录,即当前路径;
  • boost, qt, cuda, cgal 路径就按照上面设置好;
  • cmake_generator 是选择 Visual Studio 版本,这里 16 (编译器版本)就是 Visual Studio 2019 (MSVC 14.2,这几个版本数字之间的对应关系可参考 wiki 链接:https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B)。然后默认会使用 x64 编译。

不过,这个过程中你非常可能遇到一些编译错误,专门总结在下面。

编译错误和解决方案

Eigen 下载失败

第一个可能的错误是和 urllib.request.urlretrieve()相关的错误,显示 HTTP Forbidden 之类的,Eigen 下载失败。但是实际上,build.py中提供的 eigen url 是没问题的。网上说该问题一般因为下载网站有反爬虫机制,普通的这种下载方式会失败。最简单的解决方法是:

  1. 手动将 url 放浏览器中打开,然后手动下载 eigen-3.3.7.zip 文件,并放在你的 build_path 中的 __download__ 目录下,然后解压到该路径中。

  2. 注释掉下载 eigen 那句代码,就是 build_eigen(args)函数中的这一行:

download_zipfile(url, archive_path, args.build_path,
                        "888aab45512cc0c734b3e8f60280daba")

不过,下载其他几个依赖库的时候倒是没有遇到问题。

Check MD5 hash Failed

记得有一个依赖库的 MD5 Hash 验证失败(忘了哪一个,类似glog或 freeimage)。解决方法是,干脆注释掉 download_zipfile()函数中的 check hash 那一行:

check_md5_hash(archive_path, md5_hash)

Boost 的一个 Error

参考:https://github.com/microsoft/vcpkg/issues/4447

这个卡了我很久,累个半死。该错误有很多行,类似这样:

error LNK2005: "public: virtual __cdecl boost::unit_test::lazy_ostream::~lazy_ostream(void)" (??1lazy_ostream@unit_test@boost@@UEAA@XZ) alr
eady defined in libboost::XXXX

其实就是,boost library中的一个函数在 libboost 中也被重复定义了(有很多这种函数)。最后,终于在上面的参考链接中找到一点眉目:大意就是 boost 的动态链接库和静态链接库只能用一种,而不能同时用。而通常我们在安装了 boost 后,就会把 boost lib 路径放在系统环境变量的 Path 中。但是,boost lib 这个路径中同时放了动态库(boostXXX.lib 和 .dll)和静态库(libboostXXX.lib)。于是,当你再使用 boost 的静态库时,编译器就认为你同时使用了静态库和动态库,然后出错。检查 colmap\CMakeLists.txt,发现它默认的 BOOST_STATIC = ON,即默认使用静态库,造成错误。于是,解决方法就是把这个 flag 关掉即可。回到 build.py中,找到build_colmap()函数,在考后的位置增加一句:

extra_config_args.append("-DBOOST_STATIC=OFF")

把这个flag增加到 build COLMAP 使用的 cmake 命令中。这样就没有问题了。

可以打开 build_path 中的 colmap\__build__\COLMAP.sln工程,检查任意一个工程中的 libraries,上面的修改前,用的 boost libraries 应该全是静态库 libboostXXX.lib。修改后就全变成了 boostXXX.lib 了。

CGAL 文件拷贝

这个发生在 COLMAP 成功编译后的最后一步了。显示和拷贝失败相关的 copyfile() 函数错误。这很简单了,因为 CGAL 5 开始变成了 header-only 的了,没有库文件了,而build.py 是默认支持老的 CGAL 4 的,所以想找到库文件拷贝过去。不用理会这个错误就行。

其余可能错误

这里总结了一些:https://blog.csdn.net/CUSTESC/article/details/104948344

Linux 和 Mac 中安装 COLMAP

这个直接按照官方文档中的要求一步一步来即可。只是第三方库安装时多注意 Qt 的安装即可。

Search

    Table of Contents