1. 为什么要在Windows上自己编译Colmap?
如果你对三维重建感兴趣,或者你的研究、项目需要用到从照片生成三维模型的技术,那你大概率听说过Colmap。它是个功能强大的开源软件,能把一堆杂乱无章的照片,自动计算出相机位置,并生成稀疏点云、稠密点云乃至三维网格模型。官方其实提供了Windows的预编译版本可以直接下载使用,那为什么我们还要费老大劲去自己编译呢?这里面的门道,我踩过几次坑之后才深有体会。
首先,预编译版本可能“缺胳膊少腿”。最典型的就是CUDA支持。官方发布的二进制包为了兼容性,有时不会包含完整的CUDA加速功能,或者CUDA版本比较旧。如果你想用上Colmap最核心、最耗时的稠密重建模块(Multi-View Stereo, MVS),没有CUDA加速,那重建速度会让你怀疑人生——可能一张图就要算好几分钟。自己编译,就能确保CUDA被正确启用,并且能用上你显卡最新的驱动和计算能力。
其次,自定义和调试的需求。预编译版本是个黑盒子,如果你需要修改某些算法参数、集成自己的代码,或者单纯想学习一下Colmap的内部结构,自己编译是唯一的选择。我在实际项目中就遇到过需要调整特征点匹配阈值的情况,自己编译的版本可以随时修改源码并重新构建,非常灵活。
最后,依赖库的掌控权。Colmap依赖一大堆第三方库,比如Boost、Eigen、Ceres Solver等。这些库的版本如果和你的系统环境不匹配,或者编译选项不对,很容易出现各种诡异的链接错误。自己从源码编译,虽然前期麻烦,但相当于把整个工具链的主动权抓在了自己手里,后续出问题也更容易定位。说白了,自己编译虽然门槛高一点,但换来的是更高的性能、更好的灵活性和更深的可掌控度,对于想认真用Colmap做点事情的朋友来说,这笔“时间投资”是值得的。
2. 编译前的“战前准备”:环境与依赖库
在动手敲命令之前,把“战场”打扫干净,把“弹药”准备齐全,能避免后面80%的麻烦。我自己第一次编译时,就是一头扎进去,结果在依赖库上反复折腾了好几天。所以,请务必耐心完成这一步。
2.1 核心工具链安装
你需要准备以下三样核心工具,版本尽量选择较新的稳定版:
- Visual Studio:推荐使用 Visual Studio 2019 或 2022 的社区版。安装时,务必勾选“使用C++的桌面开发”工作负载,这包含了编译所需的MSVC编译器、链接器和基本的Windows SDK。这是编译所有C++项目的基石。
- CMake:这是跨平台编译的“指挥官”。去CMake官网下载安装程序,安装时记得勾选“Add CMake to the system PATH for all users”或类似选项,这样可以在任意命令行窗口使用
cmake命令。 - Git:用于克隆Colmap的源代码。同样,安装时选择将Git添加到系统环境变量。
安装完成后,我建议打开一个全新的“x64 Native Tools Command Prompt for VS 2019/2022”。这个命令行工具非常重要,它自动配置好了Visual Studio的编译环境变量。你可以在Windows开始菜单里搜索“x64 Native Tools”找到它。后续所有操作都在这个命令行窗口中进行,能确保编译环境一致。
2.2 依赖库的获取与策略
Colmap依赖的库不少,主要可以分为两类:
- 必需的基础库:如 Boost、Eigen、FreeImage、GLEW、GLFW等。它们提供了数据结构、数学运算、图像IO和OpenGL窗口支持。
- 核心算法库:主要是 Ceres Solver(用于光束法平差Bundle Adjustment)和 SuiteSparse(稀疏矩阵求解)。这两个库是Colmap稀疏重建的“发动机”。
官方推荐使用一个Python脚本(build.py)自动下载和编译这些依赖。但根据我的经验,这个脚本在国内网络环境下非常容易失败,经常卡在下载Eigen或Ceres的步骤,报错urlopen error。所以,我更推荐手动准备依赖库源码的半自动方案,虽然步骤多一点,但成功率极高。
手动准备依赖库源码的步骤:
- 为所有依赖库创建一个专门的文件夹,例如
D:\Libraries\colmap_deps。 - 分别去各个库的官网或GitHub仓库,下载指定版本的源代码压缩包。以下是我测试过的稳定版本组合(非常重要,版本不匹配是编译错误的常见根源):
- Boost: 1.72.0 或 1.80.0
- Eigen: 3.3.x 或 3.4.0
- Ceres Solver: 2.0.0 或 2.1.0
- SuiteSparse: 5.10.1 (需要和Ceres版本匹配)
- FreeImage: 官方发布的源码包
- GLEW 和 GLFW: 从GitHub下载最新release即可。
- 将所有源码包解压到
D:\Libraries\colmap_deps目录下。你的目录结构看起来应该是这样的:D:\Libraries\colmap_deps\ ├── boost_1_72_0/ ├── eigen-3.3.9/ ├── ceres-solver-2.0.0/ ├── SuiteSparse-5.10.1/ ├── FreeImage/ ├── glew-2.2.0/ └── glfw-3.3.8/
这样做的好处是,即使后续编译某个库失败,你也可以单独进入其目录排查,而不用被脚本的自动化流程裹挟。
3. 攻克第一个堡垒:编译Boost库
Boost是C++的“准标准库”,Colmap重度依赖它。网上有很多Boost的预编译二进制文件,但我强烈建议你自己从源码编译。原因很简单:预编译的版本可能缺少某些库,或者编译选项(如运行时库MT/MD)与你的环境不匹配,导致后面链接Colmap时出现“无法解析的外部符号”这种令人头疼的错误。
实测下来很稳的编译步骤如下:
- 打开之前提到的“x64 Native Tools Command Prompt”,切换到Boost源码目录:
cd D:\Libraries\colmap_deps\boost_1_72_0 - 运行引导程序生成编译工具
b2.exe:bootstrap.bat - 执行编译和安装。这里有几个关键参数需要理解:
address-model=64:编译64位库,这是必须的。link=static,shared:既生成静态库(.lib)也生成动态库(.dll)。有些依赖项可能需要动态链接。runtime-link=shared:链接到动态的MSVC运行时库(MD/MDd),这通常与Visual Studio默认设置一致,减少冲突。--prefix:指定安装目录,比如D:\Libraries\boost_install。
这个命令会编译Boost的所有模块,时间会比较长(可能半小时到一小时),请耐心等待。完成后,所有头文件(.\b2 install --prefix=D:\Libraries\boost_install --build-type=complete address-model=64 link=static,shared runtime-link=sharedinclude)和库文件(lib)都会整齐地出现在D:\Libraries\boost_install目录下。
注意:编译Boost是后面所有步骤的基础,这里务必一次成功。如果失败,通常是环境变量问题,请确保你在正确的VS命令行工具中操作。
4. 逐个击破:编译其他关键依赖库
准备好Boost之后,其他库的编译就相对简单了。我们采用CMake进行构建,这是标准流程。
4.1 编译Eigen3
Eigen是纯头文件库,不需要编译。你只需要将Eigen源码目录(例如eigen-3.3.9)的路径记住,后续告诉CMake在哪里找它就行。为了管理方便,我通常会把它“安装”一下:
- 在Eigen源码目录下新建一个
build文件夹并进入。 - 运行CMake,指定安装路径:
cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_INSTALL_PREFIX=D:\Libraries\eigen_install - 编译并安装:
这会把必要的头文件复制到安装目录,结构更清晰。cmake --build . --config Release --target install
4.2 编译GLEW和GLFW
这两个是OpenGL相关的工具库,编译过程类似。
对于GLEW:
- 进入
glew-2.2.0\build\cmake目录。 - 创建
build目录并配置CMake:cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_INSTALL_PREFIX=D:\Libraries\glew_install - 打开生成的
glew.sln,用Visual Studio编译 Release 和 Debug 配置。这里有个坑:你可能遇到链接错误LNK2019: 无法解析的外部符号 memset。解决方法是在VS中,右键glew的项目属性 -> “链接器” -> “输入” -> “附加依赖项”,为 Debug 配置添加msvcrt.lib,然后重新生成即可。 - 最后,在CMake的build目录下执行安装:
cmake --build . --config Release --target install cmake --build . --config Debug --target install
对于GLFW,步骤几乎一模一样,使用CMake配置、生成、编译、安装即可,一般很顺利。
4.3 编译Ceres Solver与SuiteSparse
这是最复杂但也最关键的一步。Ceres依赖SuiteSparse,而SuiteSparse在Windows上编译有点棘手。
首先编译SuiteSparse:
- SuiteSparse官方构建系统对Windows不太友好。我推荐使用一个维护良好的CMake版本,比如
suitesparse-metis-for-windows这个项目(可以在GitHub上找到)。或者,你可以直接使用Ceres Solver源码中scripts文件夹下的windows_make.bat脚本,它包含了编译SuiteSparse的流程。 - 如果手动编译,核心是确保成功编译出
cholmod、amd、camd、colamd、ccolamd、suitesparseconfig等库。你需要安装 Intel TBB 库并正确配置。 - 编译成功后,将生成的
.lib文件和头文件整理到一个统一的安装目录,如D:\Libraries\suitesparse_install。
然后编译Ceres Solver:
- 在Ceres源码目录创建
build文件夹。 - 使用CMake-GUI会更直观。打开CMake-GUI,设置源码路径和构建路径。
- 点击“Configure”,选择你的Visual Studio版本和“x64”。
- 关键配置如下(在CMake列表中搜索并设置):
BUILD_SHARED_LIBS: OFF (建议静态链接)CMAKE_INSTALL_PREFIX:D:\Libraries\ceres_installEigen3_DIR: 指向你之前安装的Eigen的CMake目录,例如D:\Libraries\eigen_install\share\eigen3\cmakeSUITESPARSE_INCLUDE_DIR_HINTS:D:\Libraries\suitesparse_install\includeSUITESPARSE_LIBRARY_DIR_HINTS:D:\Libraries\suitesparse_install\lib- 找到
SuiteSparse相关的各个组件(如SUITESPARSE_CHOLMOD_LIB),手动指定为你编译好的.lib文件路径。
- 点击“Generate”生成解决方案,然后用Visual Studio打开
.sln,编译 Release 和 Debug 配置下的 ALL_BUILD 和 INSTALL 项目。
这个过程可能会因为库路径问题报错,需要仔细检查CMake的输出信息,确保所有依赖都被正确找到。
5. 终极目标:编译并配置Colmap
所有依赖库就位后,终于可以编译Colmap本体了。
5.1 获取Colmap源码
使用Git克隆最新版本(或某个稳定版本)的代码:
git clone https://github.com/colmap/colmap.git
cd colmap
如果你想编译某个特定版本(如3.8),可以切换标签:git checkout 3.8
5.2 使用CMake配置Colmap项目
同样,在Colmap源码目录下创建 build 文件夹并进入。我强烈建议使用 CMake-GUI 进行第一次配置,因为需要手动指定的路径较多。
- 在CMake-GUI中,设置源码路径和构建路径。
- 点击“Configure”,选择Visual Studio和x64。
- 第一次配置后,会报红很多错误,主要是找不到依赖库。这时需要你手动指定路径:
Boost_DIR:D:\Libraries\boost_install\lib\cmake\Boost-1.72.0(具体路径根据你的Boost版本号调整)Eigen3_DIR:D:\Libraries\eigen_install\share\eigen3\cmakeCeres_DIR:D:\Libraries\ceres_install\lib\cmake\CeresFreeImage_DIR:D:\Libraries\freeimage_installGLEW_DIR:D:\Libraries\glew_install\lib\cmake\glew-2.2.0GLFW_DIR:D:\Libraries\glfw_install\lib\cmake\glfw3
- 确保
CUDA_ENABLED选项被勾选。CMake会自动检测你系统安装的CUDA Toolkit。如果你没有安装CUDA,需要先安装,版本尽量新(如11.x以上)。 - 再次点击“Configure”,直到没有红色错误出现。然后点击“Generate”。
5.3 解决编译中的“拦路虎”
生成解决方案后,用Visual Studio打开 colmap.sln。尝试编译 ALL_BUILD 项目(选择Release配置)。你可能会遇到以下经典错误:
错误1:could NOT find Boost (missing: filesystem program_options)
这说明CMake找到了Boost根目录,但没找到具体的组件。回到CMake-GUI,手动设置 Boost_INCLUDE_DIR 为 D:\Libraries\boost_install\include,设置 Boost_LIBRARY_DIR 为 D:\Libraries\boost_install\lib,然后重新Configure。
错误2:LNK2001: 无法解析的外部符号 boost::filesystem::...
这是Boost库链接问题。原因可能是你编译的Boost库的链接方式(静态/动态)与Colmap项目设置不匹配。解决方案是:在Visual Studio中,右键Colmap项目 -> 属性 -> 链接器 -> 输入 -> 附加依赖项,检查并修正Boost库的文件名。有时需要将 libboost_filesystem-vcxxx-mt-x64-1_72.lib 改为 boost_filesystem-vcxxx-mt-x64-1_72.lib(去掉lib前缀),或者反之,具体取决于你编译Boost时 link 参数的设置。
错误3:CUDA编译器版本不支持
如果启用CUDA后编译报错,提示VS版本不被CUDA支持。你可以临时修改CUDA头文件来绕过这个检查(这是一个常见的变通方法)。找到报错提示的文件,通常是 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.x\include\crt\host_config.h,找到类似 #if _MSC_VER < 1600 || _MSC_VER > 193x 的行,将上限 193x 改大一些(比如改成 1999),然后保存。注意: 这只在你知道你的CUDA版本和VS版本理论上兼容,只是头文件检查过于严格时才使用。
5.4 编译与安装
解决所有编译错误后,分别编译 Release 和 Debug 配置下的 ALL_BUILD。成功后再编译 INSTALL 项目。这会将Colmap的可执行文件、动态库和资源文件复制到你CMake配置中 CMAKE_INSTALL_PREFIX 指定的目录(例如 D:\Software\colmap_install)。
在这个安装目录的 bin 文件夹下,你会找到 colmap.bat 和 colmap-gui.exe。运行 colmap.bat 可以启动命令行版本,运行 colmap-gui.exe 则是图形界面。
6. 验证与性能调优
编译安装成功只是第一步,确保它跑得又快又好才是目的。
功能验证:
- 打开命令行,进入Colmap的安装bin目录。
- 运行
colmap.bat help,应该能看到所有命令列表。 - 找一组你自己的照片(或者网上的公开数据集),尝试一个完整的流水线:
如果稀疏重建能成功,并在colmap.bat feature_extractor --database_path database.db --image_path images/ colmap.bat exhaustive_matcher --database_path database.db colmap.bat mapper --database_path database.db --image_path images/ --output_path sparse/sparse文件夹下生成points3D.bin等文件,说明核心功能正常。 - 测试CUDA加速的稠密重建:
观察任务管理器,如果你的GPU利用率显著上升,说明CUDA加速生效了。colmap.bat image_undistorter --image_path images/ --input_path sparse/0 --output_path dense/ colmap.bat patch_match_stereo --workspace_path dense/
性能调优小技巧:
- 特征提取与匹配:在
feature_extractor阶段,可以添加--SiftExtraction.use_gpu 1参数来启用GPU加速SIFT特征提取(如果编译时启用了相关选项)。匹配阶段,对于大量图片,使用sequential_matcher或vocab_tree_matcher比exhaustive_matcher更高效。 - 稠密重建:
patch_match_stereo是最耗时的步骤,完全由CUDA加速。你可以通过--PatchMatchStereo.geom_consistency true启用几何一致性检查来提高质量,但这会更慢。根据你的GPU显存调整--PatchMatchStereo.window_radius和--PatchMatchStereo.window_step参数,平衡速度和质量。 - 内存管理:处理大型数据集时,可能会内存不足。在
mapper阶段,可以尝试--Mapper.ba_global_function_tolerance和--Mapper.ba_global_max_num_iterations来控制全局BA的精度和耗时。
自己编译的Colmap就像一个量身定制的工具,你可能需要根据不同的项目(无人机影像、室内扫描、文物重建)微调这些参数。这个过程没有标准答案,多试几次,观察输出日志和结果,你就能慢慢摸清门道。我自己的经验是,成功编译并跑通第一个完整项目后,那种成就感远超直接下载一个现成的软件。
3588



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



