colmap
文章目录
- 安装指南
- 预编译二进制文件
- Windows
- Docker
- 从源码构建
- Debian/Ubuntu
- Mac
- Windows
- VCPKG
- 库集成
- AddressSanitizer
- 文档
- 教程
- 快速入门
- 运动恢复结构(Structure-from-Motion)
- 多视图立体视觉
- 前言
- 术语说明
- 数据结构
- 特征检测与提取
- 特征匹配与几何验证
- 稀疏重建
- 导入与导出
- 密集重建
- 操作指南
- 外部库支持
- 数据库管理
- 图形界面与命令行界面
- 核心概念
- 传感器与测量
- 设备组
- 帧
- 数据库格式
- 设备与传感器
- 装备与框架
- 相机与图像
- 关键点与描述符
- 匹配与双视图几何
- 相机模型
- 设备支架支持
- 工作流程
- 未知设备传感器位姿
- 示例
- 从360°球形图像重建
- 输出格式
- 二进制文件格式
- 索引与标识符
- 稀疏重建
- 文本格式
- rigs.txt
- cameras.txt
- frames.txt
- images.txt
- points3D.txt
- 密集重建
- 深度图与法线图
- 一致性图
- 数据集
- 图形用户界面
- 模型查看器控制
- 渲染选项
- 创建截图
- 创建屏幕录像
- 命令行界面
- 示例
- 帮助
- 命令列表
- 可视化
- PyCOLMAP
- 安装
- API
- pycolmap
- Cost Functions
- 常见问题解答
- 调整不同重建场景和输出质量的选项
- 扩展COLMAP
- 共享内参
- 固定内参
- 主点优化
- 增加匹配数量/稀疏3D点
- 从已知相机位姿重建稀疏/稠密模型
- 合并断开连接的模型
- 地理配准
- 曼哈顿世界坐标系对齐
- 图像区域掩码处理
- 将新图像注册/定位到现有重建中
- 无GPU/CUDA时的可用功能
- 特征提取/匹配中的多GPU支持
- 特征匹配因非法内存访问失败
- 密集重建中完整性与准确性的权衡
- 提升弱纹理表面的密集重建效果
- 表面网格重建
- 加速密集重建
- 降低密集重建时的内存占用
- 密集重建过程中手动指定源图像
- 密集重建中的多GPU支持
- 解决密集重建过程中的GPU冻结和超时问题
- 更新日志
- COLMAP 3.12.0 (2025年6月30日)
- 新特性
- 错误修复
- 重大变更
- 完整变更列表(按时间排序)
- COLMAP 3.11.1 (2024年12月6日)
- 错误修复
- COLMAP 3.11.0 (2024年11月28日发布)
- 新特性
- 问题修复
- 重大变更
- 完整变更列表(按时间排序)
- COLMAP 3.10 (2024年7月23日)
- COLMAP 3.9.1 (2024年1月8日)
- COLMAP 3.9 (2024年1月6日)
- COLMAP 3.8 (2023年1月31日)
- COLMAP 3.7 (2022年1月26日)
- COLMAP 3.6 (2020年7月24日)
- COLMAP 3.5 (2018年8月22日)
- COLMAP 3.4 (2018/01/29)
- COLMAP 3.3 (2017年11月21日)
- COLMAP 3.2 (2017年9月2日发布)
- COLMAP 3.1 (2017年6月15日发布)
- COLMAP 3.0 (2017年5月22日)
- COLMAP 2.1 (2016年12月7日发布)
- COLMAP 2.0 (2016年9月8日)
- COLMAP 1.1 (2016年5月19日发布)
- COLMAP 1.0 (2016年4月4日)
- 贡献指南
- 许可证
- 参考文献
- 历史文档
安装指南
https://colmap.github.io/install.html
您可以选择下载预编译的二进制文件或手动编译源代码。预编译的二进制文件及其他资源可从
https://demuc.de/colmap/ 获取。
Linux/Unix/BSD 发行版的系统包概览可在
https://repology.org/metapackage/colmap/versions 查看。请注意,Linux/Unix/BSD 默认软件仓库中的 COLMAP 包不包含 CUDA 支持,需按后文说明手动编译源码。
Mac 用户可通过 Homebrew 获取预编译的 COLMAP 安装包或选择源码编译。安装 Homebrew 后,只需运行 brew install colmap
即可完成安装。
COLMAP 可通过命令行或图形界面作为独立应用程序使用。此外,COLMAP 也可作为可重用库集成到您的 C++ 项目中(详见后文)。您还能通过 PyCOLMAP 在 Python 中使用大部分功能。
预编译二进制文件
Windows
为方便使用,Windows 预编译二进制文件同时包含图形界面和命令行界面可执行程序。要启动 COLMAP 图形界面,只需双击 COLMAP.bat
批处理脚本,或在 Windows 命令提示符或 Powershell 中运行它。该批处理脚本也会自动设置必要的库路径,从而支持命令行界面访问。
要查看可用的 COLMAP 命令列表,请在命令提示符 cmd.exe
或 Powershell 中运行 COLMAP.bat -h
。首次运行 COLMAP 时,Windows 防御程序可能会弹出安全警告,因为这些二进制文件未经过官方签名。提供的 COLMAP 二进制文件由 GitHub Actions CI 机器自动构建。若不信任这些文件,可按照下文所述从源码编译。
Docker
COLMAP 提供了预构建的支持 CUDA 的 Docker 镜像。关于如何使用 Docker 构建和运行 COLMAP 的详细说明,请参阅 Docker 文档。
从源码构建
COLMAP 可在所有主流平台(Linux、Mac、Windows)上轻松构建。首先,检出最新源代码:
git clone https://github.com/colmap/colmap
在Linux和Mac系统下,通常建议按照以下安装说明操作,这些说明会使用各自系统的包管理器来安装所需依赖项。另外,对于系统软件包受限的特殊系统,也可以使用VCPKG的说明从头编译所需依赖项。在Windows系统、计算集群环境下,或者当您在Linux/Mac上没有root权限时,VCPKG方案同样是首选方法。
Debian/Ubuntu
推荐依赖项: CUDA (至少需要 7.X 版本)
来自默认 Ubuntu 软件库的依赖项:
sudo apt-get install \git \cmake \ninja-build \build-essential \libboost-program-options-dev \libboost-graph-dev \libboost-system-dev \libeigen3-dev \libfreeimage-dev \libmetis-dev \libgoogle-glog-dev \libgtest-dev \libgmock-dev \libsqlite3-dev \libglew-dev \qtbase5-dev \libqt5opengl5-dev \libcgal-dev \libceres-dev \libcurl4-openssl-dev \libmkl-full-dev
要使用 CUDA 支持进行编译,还需安装 Ubuntu 默认的 CUDA 软件包:
sudo apt-get install -y \nvidia-cuda-toolkit \nvidia-cuda-toolkit-gcc
或者,也可以从NVIDIA官网手动安装最新版CUDA。在CMake配置阶段,如需指定CUDA架构:
- 若仅需在当前机器上运行COLMAP(默认情况),使用
-DCMAKE_CUDA_ARCHITECTURES=native
- 如需支持分发到其他机器,使用 “all”/“all-major”
- 也可指定具体CUDA架构版本,如 “75” 等
完成配置后,即可编译COLMAP。
git clone https://github.com/colmap/colmap.git
cd colmap
mkdir build
cd build
cmake .. -GNinja -DBLA_VENDOR=Intel10_64lp
ninja
sudo ninja install
运行 COLMAP:
colmap -h
colmap gui
在 Ubuntu 18.04 系统下,CGAL 的 CMake 配置脚本存在问题,
您还需要安装 CGAL Qt5 软件包:
sudo apt-get install libcgal-qt5-dev
在 Ubuntu 22.04 下,使用 Ubuntu 默认的 CUDA 包和 GCC 进行编译时会遇到问题,必须改用 GCC 10 进行编译:
sudo apt-get install gcc-10 g++-10
export CC=/usr/bin/gcc-10
export CXX=/usr/bin/g++-10
export CUDAHOSTCXX=/usr/bin/g++-10
# ... and then run CMake against COLMAP's sources.
请注意,BLA_VENDOR=Intel10_64lp
选项指示CMake寻找Intel的MKL版BLAS实现。若您选择使用OpenBLAS而非MKL进行编译,由于此问题的存在,在Debian/Ubuntu系统上必须安装并选择OpenMP版本。
Mac
依赖项来自 Homebrew:
brew install \cmake \ninja \boost \eigen \freeimage \curl \libomp \metis \glog \googletest \ceres-solver \qt5 \glew \cgal \sqlite3
brew link --force libomp
配置并编译 COLMAP:
git clone https://github.com/colmap/colmap.git
cd colmap
mkdir build
cd build
cmake .. \-GNinja \-DQt5_DIR="$(brew --prefix qt@5)/lib/cmake/Qt5"
ninja
sudo ninja install
如果您的系统同时安装了 Qt 6,在配置 CMake 时可能需要临时链接到 Qt 5 安装目录:
brew link qt5
cmake ... (from previous code block)
brew unlink qt5
运行 COLMAP:
colmap -h
colmap gui
Windows
推荐依赖项: CUDA(至少7.X版本)、Visual Studio 2019
在Windows系统上,推荐使用VCPKG来构建COLMAP:
git clone https://github.com/microsoft/vcpkg
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg install colmap[cuda,tests]:x64-windows
要编译支持多种计算架构的CUDA代码,请使用:
.\vcpkg install colmap[cuda-redist]:x64-windows
详情请参阅下一节。
VCPKG
COLMAP 作为 VCPKG 发行版的一部分提供。这使得在不同平台上从头开始便捷地构建 COLMAP 及其所有依赖项成为可能。请注意,VCPKG 要求您按照平台标准方式手动安装 CUDA。要使用 VCPKG 编译 COLMAP,请运行以下命令:
git clone https://github.com/microsoft/vcpkg
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg install colmap:x64-linux
VCPKG 支持多种其他平台(例如 x64-osx、x64-windows 等)。要启用 CUDA 支持并编译所有测试:
./vcpkg install colmap[cuda,tests]:x64-linux
上述命令将构建 COLMAP 的最新发布版本。如需编译开发分支中的最新提交,可以使用以下选项:
./vcpkg install colmap:x64-linux --head
要修改源代码,可以额外添加 --editable --no-downloads
参数。
或者,如果想从其他文件夹构建并使用 vcpkg 的依赖项,需先运行 ./vcpkg integrate install
(在 Windows 下使用 pwsh 和 ./scripts/shell/enter_vs_dev_shell.ps1
),然后按如下方式配置 COLMAP:
cd path/to/colmap
mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=path/to/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=Release
cmake --build . --config release --target colmap --parallel 24
库集成
若需将COLMAP作为库集成并链接到您的项目中,最简单的方式是使用CMake作为构建配置工具。
完成COLMAP的构建配置并执行ninja/make install
后,COLMAP会自动将所有头文件安装至${CMAKE_INSTALL_PREFIX}/include/colmap
目录,所有库文件安装至${CMAKE_INSTALL_PREFIX}/lib/colmap
目录,并将CMake配置文件安装至${CMAKE_INSTALL_PREFIX}/share/colmap
目录。
例如,通过以下CMakeLists.txt
文件即可轻松编译您的源码并链接COLMAP:
cmake_minimum_required(VERSION 3.10)project(SampleProject)find_package(colmap REQUIRED)
# or to require a specific version: find_package(colmap 3.4 REQUIRED)add_executable(hello_world hello_world.cc)
target_link_libraries(hello_world colmap::colmap)
源代码如下 hello_world.cc
:
#include <cstdlib>
#include <iostream>#include <colmap/controllers/option_manager.h>
#include <colmap/util/string.h>int main(int argc, char** argv) {colmap::InitializeGlog(argv);std::string message;colmap::OptionManager options;options.AddRequiredOption("message", &message);options.Parse(argc, argv);std::cout << colmap::StringPrintf("Hello %s!\n", message.c_str());return EXIT_SUCCESS;
}
然后按以下方式编译并运行你的代码:
mkdir build
cd build
export colmap_DIR=${CMAKE_INSTALL_PREFIX}/share/colmap
cmake .. -GNinja
ninja
./hello_world --message "world"
该示例的源代码存储在 doc/sample-project
目录下。
AddressSanitizer
如果你想在启用地址消毒器(AddressSanitizer)标志的情况下构建COLMAP,需要使用支持ASan的最新编译器。例如,在Ubuntu机器上可以手动安装最新版本的clang,并按以下方式调用CMake:
CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake .. \-DASAN_ENABLED=ON \-DTESTS_ENABLED=ON \-DCMAKE_BUILD_TYPE=RelWithDebInfo
请注意,通常将ASan与调试符号结合使用有助于获取所报告问题的有意义的跟踪信息。
文档
你需要安装 Python 和 Sphinx 来构建 HTML 文档:
cd path/to/colmap/doc
sudo apt-get install python
pip install sphinx
make html
open _build/html/index.html
或者,你也可以将文档构建为PDF、EPUB等格式:
make latexpdf
open _build/pdf/COLMAP.pdf
教程
https://colmap.github.io/tutorial.html
本教程通过演示COLMAP中的各个处理步骤,介绍基于图像的3D重建主题。如果您想了解关于基于图像的3D重建更通用和数学化的介绍,请参考CVPR 2017大规模众包数据3D建模教程以及[schoenberger_thesis]。
传统的基于图像的3D重建流程首先通过运动恢复结构(SfM)技术获取场景的稀疏表示和输入图像的相机位姿。该输出结果随后作为多视图立体视觉(MVS)的输入,用于重建场景的密集表示。
快速入门
首先,按照此处的说明启动COLMAP的图形用户界面。COLMAP提供了一个自动重建工具,只需输入包含图像的文件夹,即可在工作区文件夹中生成稀疏和密集的重建结果。在GUI中点击Reconstruction > Automatic Reconstruction
,并指定相关选项。输出结果将写入工作区文件夹。
例如,如果您的图像位于path/to/project/images
,您可以选择path/to/project
作为工作区文件夹。运行自动重建工具后,该文件夹的内容将类似于以下结构:
+── images
│ +── image1.jpg
│ +── image2.jpg
│ +── ...
+── sparse
│ +── 0
│ │ +── rigs.bin
│ │ +── cameras.bin
│ │ +── frames.bin
│ │ +── images.bin
│ │ +── points3D.bin
│ +── ...
+── dense
│ +── 0
│ │ +── images
│ │ +── sparse
│ │ +── stereo
│ │ +── fused.ply
│ │ +── meshed-poisson.ply
│ │ +── meshed-delaunay.ply
│ +── ...
+── database.db
此处,path/to/project/sparse
目录包含所有重建组件的稀疏模型,而 path/to/project/dense
则存放它们对应的稠密模型。稠密点云 fused.ply
可通过 COLMAP 的 File > Import model from ...
选项导入,而稠密网格则需借助 Meshlab 等外部查看器进行可视化。
以下章节将提供通用建议,并更详细地描述重建流程。若您需要对重建过程/参数进行更多控制,或对 COLMAP 的底层技术感兴趣,可参考这些内容。
运动恢复结构(Structure-from-Motion)
COLMAP的增量式运动恢复结构流程。
运动恢复结构(Structure-from-Motion,简称SfM)是指通过一系列图像中的投影信息重建三维结构的过程。输入是同一物体从不同视角拍摄的一组重叠图像,输出是物体的三维重建结果以及所有图像重建出的相机内参和外参。典型的运动恢复结构系统将这一过程分为三个阶段:
- 特征检测与提取
- 特征匹配与几何验证
- 结构与运动重建
COLMAP通过不同模块实现这些阶段,各模块可根据应用需求组合使用。关于运动恢复结构的通用原理及COLMAP中的算法细节,可参阅文献[schoenberger16sfm]和[schoenberger16mvs]。
若您能控制拍摄过程,请遵循以下准则以获得最佳重建效果:
- 拍摄纹理丰富的图像。避免完全无纹理的图像(如白墙或空桌面)。若场景本身纹理不足,可放置辅助背景物体(如海报等)。
- 在光照条件相近时拍摄。避免高动态范围场景(如逆光拍摄的阴影场景或透过门窗拍摄的画面)。避免反光表面的镜面反射。
- 确保图像间具有高度视觉重叠。每个物体至少出现在3张图像中——数量越多越好。
- 从不同视角拍摄。避免仅通过旋转相机在同一位置拍摄,建议每次拍摄后移动几步。同时需保证从相对接近的视角拍摄足够数量的图像。注意图像数量并非越多越好,过多可能导致重建过程缓慢。若使用视频作为输入,建议对帧率进行降采样处理。
多视图立体视觉
多视图立体视觉(Multi-View Stereo,MVS)利用运动恢复结构(SfM)的输出结果,计算图像中每个像素的深度和/或法线信息。
通过将多幅图像的深度图与法线图在三维空间中进行融合,最终生成场景的稠密点云。
基于融合点云的深度和法线信息,可以采用(筛选)泊松曲面重建等算法[kazhdan2013]来恢复场景的三维表面几何结构。
关于多视图立体视觉的概述及COLMAP中相关算法的更多信息,可参阅文献[schoenberger16mvs]。
前言
对于普通用户来说,COLMAP只需几个简单步骤即可完成标准的三维重建。对于经验更丰富的用户,该程序提供了众多参数选项,其中只有部分对新手来说是直观易懂的。
通常情况下,程序无需修改任何参数即可正常工作。默认参数设置是在重建鲁棒性/质量与速度之间权衡后的选择。
您可以通过Extras > Set options for ... data
为不同重建场景选择"最优"配置。若不确定如何设置参数,建议保持默认值。源代码中包含关于所有参数的更详细说明文档。
请注意,COLMAP是科研软件,在极少数情况下若某些约束条件未满足,程序可能会异常退出。
此时,程序会向标准输出打印回溯信息。建议通过命令行运行可执行文件(包括GUI界面),这样既可查看回溯信息,也能通过设置不同级别的日志详细程度获取更多调试信息。
术语说明
相机这一术语指代具有相同变焦系数和镜头的物理相机设备。在COLMAP中,相机定义了内参投影模型。单个相机可以拍摄多张具有相同分辨率、内参和畸变特性的图像。
图像这一术语关联到位图文件,例如磁盘上的JPEG或PNG文件。COLMAP会在每张图像中检测关键点,这些关键点的外观由数值化描述符表征。
关键点/描述符之间基于纯外观的对应关系称为匹配,而经过几何验证并用于重建过程的匹配则称为内点匹配。
数据结构
COLMAP 假设所有输入图像都存放在一个可能包含嵌套子目录的输入文件夹中。它会递归处理该目录下存储的所有图像,并支持多种不同的图像格式(参见 FreeImage)。
其他文件会被自动忽略。若对性能有较高要求,建议将非图像文件单独存放。系统通过相对文件路径唯一标识每张图像。为了后续处理(如图像去畸变或密集重建),需保持相对文件夹结构不变。
COLMAP 不会修改输入图像或目录,所有提取的数据均存储在一个独立的 SQLite 数据库文件中(参见 数据库格式)。
第一步是启动 COLMAP 的图形用户界面:可通过运行预编译的可执行文件(Windows:COLMAP.bat
,Mac:COLMAP.app
),或在 CMake 构建文件夹中执行 ./src/colmap/exe/colmap gui
命令。接着通过选择 文件 > 新建项目
创建新项目。在此对话框中,需指定数据库存储位置和包含输入图像的文件夹。
为方便起见,可通过选择 文件 > 保存项目
将整个项目设置保存至配置文件。
项目配置不仅存储数据库和图像文件夹的绝对路径信息,还包括所有其他参数设置。若移动数据库或图像文件夹,必须通过创建新项目来更新路径。此外,也可直接使用文本编辑器修改生成的 .ini
配置文件。
要重新打开现有项目,只需选择 文件 > 打开项目
加载配置文件,所有参数设置将自动恢复。注意所有 COLMAP 可执行文件均可通过命令行启动,既可指定单独的命令行参数,也可提供项目配置文件路径(参见接口)。
示例文件夹结构如下所示:
/path/to/project/...
+── images
│ +── image1.jpg
│ +── image2.jpg
│ +── ...
│ +── imageN.jpg
+── database.db
+── project.ini
在这个示例中,您需要选择 /path/to/project/images
作为图片文件夹路径,/path/to/project/database.db
作为数据库文件路径,并将项目配置保存到 /path/to/project/project.ini
。
特征检测与提取
第一步,特征检测/提取会在图像中寻找稀疏特征点,并使用数值描述符来表征其外观。COLMAP 通过单步操作导入图像并执行特征检测/提取,从而只需从磁盘加载一次图像。
接着选择 Processing > Extract features
。在此对话框中,首先需要确定采用的相机内参模型。您可以选择从嵌入的 EXIF 信息中自动提取焦距数据,或手动指定内参(例如通过实验室标定获得)。
若图像包含部分 EXIF 信息,COLMAP 会自动尝试从庞大的相机模型数据库中补全缺失的相机规格。如果所有图像均由同一物理相机以相同变焦系数拍摄,建议在所有图像间共享内参。
请注意:若共享相同相机模型但图像尺寸或 EXIF 焦距不一致,程序将异常退出。
若存在多组共享相同内参的图像,后续也可轻松修改相机模型(参见数据库管理)。若不确定如何选择,直接使用默认参数即可。
您可以选择从图像中检测提取新特征,或从文本文件导入现有特征。COLMAP 通过 GPU 或 CPU 提取 SIFT [lowe04] 特征。GPU 版本需要连接显示器,而 CPU 版本推荐在服务器上使用。
通常 GPU 版本更优,因其定制化的特征检测模式在处理高对比度图像时往往能生成更高质量的特征。
若导入现有特征,每张图像旁需有对应文本文件(例如 /path/to/image1.jpg
和 /path/to/image1.jpg.txt
),格式如下:
NUM_FEATURES 128
X Y SCALE ORIENTATION D_1 D_2 D_3 ... D_128
...
X Y SCALE ORIENTATION D_1 D_2 D_3 ... D_128
其中X, Y, SCALE, ORIENTATION
为浮点数,D_1...D_128
的取值范围是0...255
。该文件应包含NUM_FEATURES
行数据,每行对应一个特征。例如,若某图像有4个特征,则文本文件内容应类似如下:
4 128
1.2 2.3 0.1 0.3 1 2 3 4 ... 21
2.2 3.3 1.1 0.3 3 2 3 2 ... 32
0.2 1.3 1.1 0.3 3 2 3 2 ... 2
1.2 2.3 1.1 0.3 3 2 3 2 ... 3
请注意,按照惯例,图像的左上角坐标为 (0, 0)
,而左上角第一个像素的中心坐标为 (0.5, 0.5)
。如果需要为大型图像集导入特征,使用您熟悉的脚本语言直接访问数据库效率会更高(参见数据库格式)。
完成所有选项设置后,选择 Extract
并等待提取完成或取消。如果在提取过程中取消操作,下次为同一项目启动图像提取时,COLMAP 会自动从上次中断处继续。这一机制也允许您向现有项目/重建中添加图像。此时,若使用共享内参,请务必验证相机参数。
所有提取的数据将存储在数据库文件中,可通过数据库管理工具查看/管理(参见数据库管理),或由专家直接使用 SQLite 修改(参见数据库格式)。
特征匹配与几何验证
在第二步中,特征匹配和几何验证用于发现不同图像间特征点的对应关系。
请选择 Processing > Feature matching
并选用以下针对不同输入场景设计的匹配模式:
- 穷举匹配:若数据集图像数量较少(数百张以内),此模式速度较快且能获得最佳重建效果。该模式会让每张图像与其他所有图像进行匹配,其中块大小参数决定同时从磁盘加载到内存的图像数量。
- 序列匹配:适用于按顺序采集的图像(如摄像机拍摄的视频帧)。
此时连续帧之间存在视觉重叠,无需穷举所有图像对匹配。该模式会匹配连续拍摄的图像,并内置基于词汇树的闭环检测功能:每N张图像(loop_detection_period
)会与其视觉最相似的图像(loop_detection_num_images
)进行匹配。注意图像文件名需按顺序命名(如image0001.jpg
、image0002.jpg
等)。
数据库中的顺序无关紧要,因为系统会根据文件名显式排序。
闭环检测需要预训练词汇树,默认树文件会自动下载缓存。更多树文件可从https://demuc.de/colmap/获取。
若数据库中正确配置了设备支架和帧参数,序列匹配会自动匹配连续帧中的所有图像。 - 词汇树匹配:此模式[schoenberger16vote]通过带空间重排的词汇树,将每张图像与其视觉最近邻匹配。推荐用于大型图像集(数千张),需从https://demuc.de/colmap/下载预训练词汇树。
- 空间匹配:根据空间最近邻关系匹配图像。空间位置可通过数据库管理手动设置,COLMAP默认也会从EXIF提取GPS信息用于空间最近邻搜索。若有准确先验位置信息,推荐使用此模式。
- 传递匹配:利用已有特征匹配的传递关系生成更完整的匹配图。若图像A匹配B且B匹配C,该匹配器会尝试直接匹配A与C。
- 自定义匹配:可指定特定图像对进行匹配或导入特定特征匹配。指定图像对需提供每行包含一对图像名的文本文件:
image1.jpg image2.jpg
image1.jpg image3.jpg
...
其中 image1.jpg
是图片文件夹中的相对路径。导入单个特征匹配时,您有两种选择:未经几何验证的原始特征匹配,或已经过几何验证的特征匹配。这两种情况下,预期的格式均为:
image1.jpg image2.jpg
0 1
1 2
3 4
<empty-line>
image1.jpg image3.jpg
0 1
1 2
3 4
4 5
<empty-line>
...
其中 image1.jpg
是图像文件夹中的相对路径,数字对表示各自图像中从零开始的特征索引。如果需要为大型图像集合导入大量匹配项,使用您选择的脚本语言直接访问数据库会更高效。
完成所有选项设置后,选择 Match
并等待匹配完成或中途取消。
请注意,此步骤可能耗费大量时间,具体取决于图像数量、每张图像的特征数量以及所选匹配模式。
详尽匹配的预期时间从几十张图像的几分钟到几百张图像的几小时,再到数千张图像的数天或数周不等。
如果取消匹配过程或在匹配后导入新图像,COLMAP 只会匹配之前未匹配过的图像对。
跳过已匹配图像对的开销很低。这也支持在初始匹配后导入额外图像进行匹配,并允许对同一数据集组合不同的匹配模式。
所有提取的数据将存储在数据库文件中,可通过数据库管理工具查看/管理(参见数据库管理),或由专家直接使用 SQLite 修改(参见数据库格式)。
请注意,特征匹配需要 GPU,且匹配过程中计算机的显示性能可能显著下降。如果系统配备多块支持 CUDA 的 GPU,可通过 gpu_index
选项选择特定 GPU。
稀疏重建
完成前两步生成场景图后,您可以通过选择Reconstruction > Start
启动增量式重建流程。COLMAP首先会将数据库中的所有提取数据加载到内存中,并从初始图像对开始重建。
随后,系统通过注册新图像和三角化新点的方式逐步扩展场景。
在此过程中,重建结果会以"实时"方式可视化。关于可用控制的详细信息,请参阅图形用户界面章节。
如果未能将所有图像注册到同一模型中,COLMAP会尝试重建多个模型。用户可通过工具栏的下拉菜单选择不同模型。若不同模型包含共同的已注册图像,可使用model_converter
可执行文件将它们合并为单一重建(具体操作参见常见问题)。
理想情况下,重建过程应顺利完成且所有图像都能成功注册。若出现异常情况,建议采取以下措施:
- 执行额外匹配:为获得最佳效果,可采用穷举匹配、启用引导匹配、增加词汇树匹配中的最近邻数量,或提高序列匹配的重叠度等
- 当COLMAP初始化失败时,手动选择初始图像对:通过
Reconstruction > Reconstruction options > Init
选项,从数据库管理工具中选择具有足够多视角匹配的图像对进行设置
导入与导出
COLMAP 提供了多种导出选项以便后续处理。为获得最大灵活性,建议通过选择 File > Export
导出当前查看的模型,或选择 File > Export all
导出所有重建模型,以 COLMAP 原生数据格式保存重建结果。导出时会在选定文件夹中生成独立的文本文件,分别存储重建的相机参数、图像数据和三维点云。
当以 COLMAP 原生格式导出后,您可以通过 File > Import
选择导出文件夹路径重新导入重建结果,用于后续可视化、图像去畸变处理,或在现有重建基础上继续工作(例如导入并匹配新图像后)。
此外,通过 File > Export as...
也可将模型导出为 Bundler、VisualSfM [1]、PLY 或 VRML 等其他格式。COLMAP 支持通过 File > Import From...
导入带有 RGB 信息的 PLY 点云文件进行可视化。
关于导出模型格式的详细信息请参阅此处。
密集重建
在完成场景的稀疏表示和输入图像的相机位姿重建后,MVS(多视图立体视觉)现在可以恢复更密集的场景几何结构。COLMAP集成了一个密集重建流程,能够为所有已注册图像生成深度图和法线图,将这些深度和法线图融合成带法线信息的密集点云,并最终使用泊松重建[kazhdan2013]或Delaunay重建从融合的点云中估算出密集表面。
操作指南
- 将稀疏3D模型导入COLMAP(或在完成前述稀疏重建步骤后选择已重建的模型)
- 选择
Reconstruction > Multi-view stereo
并指定一个空文件夹或现有工作区文件夹用于输出所有密集重建结果
流程步骤:
- 首先对图像进行
undistort
(去畸变)处理 - 使用
stereo
计算深度图和法线图 - 通过
fuse
将深度图和法线图融合为点云 - 最后可选执行点云
meshing
(网格化)步骤
注意事项:
- 立体重建过程中,由于计算负载较大,显示界面可能出现冻结
- 若GPU内存不足,重建过程可能会异常终止
- 相关解决方案请参考FAQ:冻结问题 和 内存问题
- 点云的法线信息无法直接在COLMAP中可视化,需通过Meshlab等软件启用
Render > Show Normal/Curvature
查看 - 重建的密集表面网格模型需使用外部软件进行可视化
外部库支持
除内置功能外,COLMAP还支持导出到以下密集重建库:
- CMVS/PMVS [furukawa10]
- CMP-MVS [jancosek11]
- Line3D++ [hofer16]
操作步骤:
- 选择
Extras > Undistort images
并选择对应格式 - 输出文件夹将包含重建结果和去畸变图像
- 文件夹内提供示例脚本用于执行密集重建
运行PMVS2的命令示例:
./path/to/pmvs2 /path/to/undistortion/folder/pmvs/ option-all
注意事项:
/path/to/undistortion/folder
需选择去畸变对话框中的文件夹- 命令行参数中
/path/to/undistortion/folder/pmvs/
的末尾斜杠不可省略
大数据集建议:
- 先运行CMVS将场景分割为更易处理的部分
- 再运行COLMAP或PMVS2
- 具体操作参考去畸变输出文件夹中的示例脚本
数据库管理
您可以在数据库管理工具中查看和管理已导入的相机、图像及特征匹配数据。
选择菜单栏中的Processing > Manage database
,在打开的对话框中可以查看已导入图像和相机的列表。
通过点击Show image
和Overlapping images
按钮,可分别查看每张图像的特征点及其匹配情况。
双击数据库表格中的特定单元格可直接修改条目内容。请注意,所有数据库变更需点击Save
按钮后才会生效。
若要在任意图像组间共享相机内参,请先选中单张或多张图像,然后选择Set camera
并设置camera_id
(该ID需与cameras表中的唯一camera_id
列对应)。
您也可以添加带特定参数的新相机。通过将prior_focal_length
标志设为0或1,可向重建算法提示是否应信任当前焦距值:若采用实验室标定数据,建议设为1;若无焦距先验知识,推荐设置为1.25 * max(width_in_px, height_in_px)
。
当前数据库管理工具功能有限,如需完全控制数据,需直接修改SQLite数据库(参见数据库格式)。
通过直接操作数据库,您可仅使用COLMAP进行特征提取与匹配,或导入自定义特征及匹配数据来单独调用COLMAP的增量式重建算法。
图形界面与命令行界面
COLMAP的大部分功能均可通过图形界面和命令行界面访问,两者集成在同一个可执行文件中。您可以直接以命令行参数形式提供选项,也可以通过--project_path path/to/project.ini
参数指定包含配置选项的.ini
项目配置文件。
要启动图形界面应用程序,请执行colmap gui
命令。若想避免在图形界面中繁琐的选项选择过程,可直接指定项目配置文件:colmap gui --project_path path/to/project.ini
。要查看命令行支持的不同命令列表,请执行colmap help
。例如,若要通过命令行运行特征提取功能,需执行colmap feature_extractor
命令。
更多关于可用命令的详细信息,请参阅图形用户界面和命令行界面章节。
脚注
[1] VisualSfM的[wu13]投影模型将畸变应用于测量值,而COLMAP应用于投影过程,因此导出的NVM文件与VisualSfM不完全兼容。
核心概念
https://colmap.github.io/concepts.html
从 COLMAP 3.12 版本开始,引入了"设备组"(rigs)和"帧"(frames)的概念,旨在为多传感器平台及 360°全景图像提供系统化的建模方案。
这些概念构建了一个结构化框架,用于组织传感器及其测量数据,从而实现对不同类型数据(例如参见设备组支持)更灵活的校准与融合。
这些新增功能保持向后兼容,不会影响 COLMAP 在单相机采集场景下的传统默认使用方式。
传感器与测量
传感器是一种能够采集环境数据并在特定时间戳生成测量结果的设备。
最常见的传感器类型是相机,它以图像形式获取测量数据。
其他例子包括IMU(惯性测量单元),用于记录加速度和角速度;以及GNSS接收器,可提供绝对位置信息。
目前,COLMAP仅支持相机及其图像测量功能,但其传感器概念设计具备可扩展性,未来可支持IMU、GNSS等其他类型,以实现多模态数据融合。
设备组
设备组(rig)用于建模由多个传感器组成的平台,这些传感器具有固定的相对位姿,能够实现同步且一致的多传感器数据采集。典型应用包括立体相机系统、头戴式AR/VR设备以及自动驾驶传感器套件。
设备组也可以是虚拟的——例如,通过建模多个虚拟相机的排列来捕获重叠视场,用于生成无缝的360°全景图像。
在COLMAP中,每个传感器必须唯一关联到一个设备组。每个设备组拥有一个定义其坐标系原点的参考传感器。
以立体相机设备组为例:其中一个相机被指定为参考传感器,其sensor_from_rig
位姿为单位矩阵;
而第二个相机的位姿则相对于该参考传感器定义。在单相机配置中,相机自身即作为其设备组的唯一参考传感器。
帧
帧表示在单个时间戳捕获的装置数据,包含该装置中一个或多个传感器的测量值。
例如,如果一个装置包含三个传感器,一帧可能包含所有三个传感器的测量数据,也可能只包含部分传感器的数据,具体取决于数据可用性。
这一概念使得多传感器数据能够在特定时间点上建立关联。
举例来说,在录制视频的双目相机装置中,每一帧对应一组同时刻捕获的两张图像——分别来自两个相机。
数据库格式
https://colmap.github.io/database.html
COLMAP将所有提取的信息存储在单个SQLite数据库文件中。可以通过以下方式访问该数据库:
- COLMAP图形界面中的数据库管理工具包
- 提供的C++数据库API(参见
src/colmap/scene/database.h
) - 使用Python配合pycolmap
数据库包含以下表:
- rigs(设备组)
- cameras(相机)
- frames(帧)
- images(图像)
- keypoints(关键点)
- descriptors(描述符)
- matches(匹配)
- two_view_geometries(双视图几何)
要初始化一个包含所需架构的空SQLite数据库文件,您可以选择:
- 在图形界面中创建新项目
- 执行
src/colmap/exe/database_create.cc
设备与传感器
设备与传感器(如相机等)之间的关系是一对多,其中一个传感器会被选为参考传感器,用于定义设备的原点。每个传感器只能属于一个设备。
装备与框架
装备与框架之间的关系是一对多(1-to-N),其中框架定义了装备的一个具体实例,该实例可以同时暴露全部或部分传感器。
相机与图像
相机与图像之间的关系是一对多的。这对运动恢复结构(SfM)有重要影响,因为同一台相机共享相同的内参(焦距、主点、畸变等),而每张图像都有独立的外参(方位和位置)。
相机的内参以float64
格式的连续二进制块存储,其排列顺序遵循src/colmap/sensor/models.h
中的定义。COLMAP仅使用被图像引用的相机,其他相机将被忽略。
图像表中的name
列表示图像文件夹中的唯一相对路径。因此,只要保持相对文件夹结构不变,数据库文件和图像文件夹可以移动到不同位置。
当手动向数据库插入图像和相机数据时,请确保所有标识符为正且非零,即满足image_id > 0
和camera_id > 0
。
关键点与描述符
检测到的关键点以行优先的float32
二进制块形式存储,其中前两列分别表示图像中的X和Y坐标位置。COLMAP采用以下坐标约定:图像左上角坐标为(0, 0)
,而左上角第一个像素的中心坐标为(0.5, 0.5)
。
若关键点包含4列数据,则特征几何形态为相似变换,其中第三列表示特征尺度,第四列表示特征方向(遵循SIFT惯例)。
若关键点包含6列数据,则特征几何形态为仿射变换,最后4列编码其仿射形状(详见src/feature/types.h
)。
提取的描述符以行优先的uint8
二进制块形式存储,每行描述关键点表中对应条目的特征外观。需注意当前COLMAP仅支持128维描述符,即cols
列必须为128。
在这两个表中,rows
列表示每张图像检测到的特征数量,rows=0
表示图像无特征。进行特征匹配和几何验证时,每张图像必须具有对应的关键点和描述符条目。
需特别说明:仅当使用带快速空间验证的词汇树匹配时,才需要提供有效的局部特征几何信息(即只需提供X和Y坐标,其他关键点列可设为零)。重建流程的其他环节仅使用关键点位置信息。
匹配与双视图几何
特征匹配的结果存储在 matches
表中,而几何验证的结果则保存在 two_view_geometries
表中。
COLMAP 在重建过程中仅使用 two_view_geometries
表中的数据。
这两个表中的每条记录都存储了两幅独特图像之间的特征匹配信息,其中 pair_id
是通过以下方式生成的上三角匹配矩阵的行主序线性索引:
def image_ids_to_pair_id(image_id1, image_id2):if image_id1 > image_id2:return 2147483647 * image_id2 + image_id1else:return 2147483647 * image_id1 + image_id2
图像标识符可以通过 pair_id
唯一确定如下:
def pair_id_to_image_ids(pair_id):image_id2 = pair_id % 2147483647image_id1 = (pair_id - image_id2) / 2147483647return image_id1, image_id2
pair_id
能够提升数据库查询效率,因为匹配表可能包含数亿条记录。
该方案将数据库中图像的最大数量限制为 2147483647(32 位有符号整数的最大值),即 image_id
必须小于 2147483647。
匹配表中的二进制数据块是行优先的 uint32
矩阵,其中左列表示基于零的 image_id1
特征索引,右列表示 image_id2
的特征索引。
cols
列的值必须为 2,而 rows
列则指定了特征匹配的数量。
two_view_geometries
表中的 F、E、H 数据块以行优先的 float64
格式存储为 3x3 矩阵。
config
值的具体含义记录在 src/estimators/two_view_geometry.h
源文件中。
相机模型
https://colmap.github.io/cameras.html
COLMAP 实现了多种不同复杂度的相机模型。如果事先不知道内参,通常最好选择能够充分模拟畸变效应的最简单相机模型:
SIMPLE_PINHOLE
,PINHOLE
:如果图像已预先去畸变,使用这些模型。
它们分别使用一个和两个焦距参数。注意即使图像已去畸变,COLMAP仍可能尝试用更复杂的模型优化内参。SIMPLE_RADIAL
,RADIAL
:当内参未知且每张图像都有不同校准参数时(如网络照片),应首选这些模型。
它们都是OPENCV
模型的简化版本,仅用一个或两个参数模拟径向畸变。OPENCV
,FULL_OPENCV
:如果已知校准参数,使用这些模型。
当多张图像共享内参时,也可尝试让COLMAP估计参数。注意若每张图像内参不同,自动估计很可能失败。SIMPLE_RADIAL_FISHEYE
,RADIAL_FISHEYE
,OPENCV_FISHEYE
,FOV
,THIN_PRISM_FISHEYE
,RAD_TAN_THIN_PRISM_FISHEYE
:鱼眼镜头专用模型,其他模型无法有效模拟鱼眼畸变。
FOV
模型被Google Project Tango使用(注意不要将omega
初始化为零)。
可通过以下方式查看估计的内参:
- 在模型查看器中双击特定图像
- 导出模型后打开
cameras.txt
文件
为获得最佳重建效果,可能需要尝试不同相机模型。
当重建失败且估计的焦距值/畸变系数明显错误时,通常说明模型过于复杂;
反之,若COLMAP频繁进行局部/全局光束法平差,则说明模型过于简单。
您还可以:
- 共享多张图像的相机内参以提高可靠性
- 在重建过程中固定内参
各相机模型参数详情请参考头文件:
https://github.com/colmap/colmap/blob/main/src/colmap/sensor/models.h
设备支架支持
https://colmap.github.io/rigs.html
COLMAP 在重建过程中原生支持传感器设备支架建模。
支架中的传感器被假定为彼此间具有固定的相对位姿,其中一个参考传感器定义了支架的坐标系原点。
一个帧代表支架在特定时刻的实例,此时所有或部分传感器同时曝光。
例如,在立体相机支架中,一个相机会被定义为参考传感器并具有恒等变换的sensor_from_rig
位姿,而第二个相机则相对于参考相机进行位姿标定。
每个帧通常由两幅图像组成,代表两个相机在同一时刻的测量数据。
工作流程
默认情况下,当运行标准重建流程时,每个相机都被建模为独立的云台装置,因此每帧仅包含单张图像。为了建立云台装置模型,推荐的工作流程是通过以下文件夹结构按云台和相机组织图像(请确保同一帧对应的图像在所有文件夹中具有相同的文件名):
rig1/camera1/image0001.jpgimage0002.jpg...camera2/image0001.jpg # same frame as camera1/image0001.jpgimage0002.jpg # same frame as camera1/image0002.jpg......
rig2/camera1/......
...
下一步,我们将首先使用以下方法提取特征:
colmap feature_extractor \--image_path $DATASET_PATH/images \--database_path $DATASET_PATH/database.db \--ImageReader.single_camera_per_folder 1
默认情况下,生成的数据库现在会为每个相机创建独立的 rig,并为每张图像创建独立的 frame。
因此,我们需要根据所需的 rig 配置来调整数据库中的关联关系。这可以通过以下方式实现:
colmap rig_configurator \--database_path $DATASET_PATH/database.db \--rig_config_path $DATASET_PATH/rig_config.json
当已知传感器在设备中的相对位姿时,rig_config.json
文件内容可能如下所示:
[{"cameras": [{"image_prefix": "rig1/camera1/","ref_sensor": true},{"image_prefix": "rig1/camera2/","cam_from_rig_rotation": [0.7071067811865475,0.0,0.7071067811865476,0.0],"cam_from_rig_translation": [0,0,0]}]},{"cameras": [{"image_prefix": "rig2/camera1/","ref_sensor": true},...]},...
]
请注意,这会修改数据库中的rig(设备组)和frame(帧)配置,其中包含了完整的rig规格参数,这些参数将作为后续处理步骤的输入。
当相机参数已完成校准时,每个相机还可选地配置camera_model_name
和camera_params
字段。
若需要对rig和frame进行更细粒度的配置,最便捷的方式是使用pycolmap手动配置数据库:既可以通过调用apply_rig_config
函数实现,也可以单独向重建任务添加所需的rig和frame对象以获得最大灵活性。
接下来我们运行标准特征匹配流程。需特别注意:必须在序列特征匹配前完成rig配置,因为相邻帧中的图像会自动进行相互匹配。
最后,我们可以使用标准mapper
命令重建场景,并通过添加--Mapper.ba_refine_sensor_from_rig 0
参数来保持rig中相对位姿固定不变。
未知设备传感器位姿
如果设备中各传感器的相对位姿并非预先已知,仅知道一组特定传感器被刚性安装且同时曝光,可以尝试以下两步重建方法。
开始前,请确保按前述方式组织图像,并使用--ImageReader.single_camera_per_folder 1
选项进行特征提取。
接着,在不施加设备约束的条件下重建场景——将每个相机建模为独立设备(这是COLMAP未经额外配置时的默认行为)。注意,该重建可以是完整输入图像集的子集形成的部分重建。
唯一要求是:每个相机必须至少有一张已配准图像与参考相机的已配准图像处于同一坐标系中。若重建成功且配准图像间的相对位姿大致正确,即可继续下一步。
rig_configurator
工具也可在没有cam_from_rig_*
变换的情况下工作。通过提供场景的现有(部分)重建结果,它能从所有已配准图像计算出传感器在设备中的平均相对位姿:
colmap rig_configurator \--database_path $DATASET_PATH/database.db \--input_path $DATASET_PATH/sparse-model-without-rigs-and-frames \--rig_config_path $DATASET_PATH/rig_config.json \[ --output_path $DATASET_PATH/sparse-model-with-rigs-and-frames ]
提供的 rig_config.json
文件只需省略对应的 cam_from_rig_rotation
和 cam_from_rig_translation
字段即可。
现在,我们可以选择对(可选的)输出重建结果运行 rig bundle adjustment,该重建已配置好 rig 和帧参数:
colmap bundle_adjuster \--input_path $DATASET_PATH/sparse-model-with-rigs-and-frames \--output_path $DATASET_PATH/bundled-sparse-model-with-rigs-and-frames
或者,也可以选择从头开始使用 rig 约束进行重建过程,这可能会带来更精确的重建结果:
colmap mapper--image_path $DATASET_PATH/images \--database_path $DATASET_PATH/database.db \--output_path $DATASET_PATH/sparse-model-with-rigs-and-frames
示例
以下示例展示了如何使用COLMAP的rig支持功能完整重建ETH3D rig数据集中的一个案例:
wget https://www.eth3d.net/data/terrains_rig_undistorted.7z
7zz x terrains_rig_undistorted.7zcolmap feature_extractor \--database_path terrains/database.db \--image_path terrains/images \--ImageReader.single_camera_per_folder 1
ETH3D数据集提供了现成的COLMAP重建真值数据,我们利用这些数据来配置传感器设备位姿以及相机模型,具体通过以下方式实现:
colmap rig_configurator \--database_path terrains/database.db \--rig_config_path terrains/rig_config.json \--input_path terrains/rig_calibration_undistorted
使用 rig_config.json
文件时:
[{"cameras": [{"image_prefix": "images_rig_cam4_undistorted/","ref_sensor": true},{"image_prefix": "images_rig_cam5_undistorted/"},{"image_prefix": "images_rig_cam6_undistorted/"},{"image_prefix": "images_rig_cam7_undistorted/"}]}
]
请注意,我们并未指定传感器位姿,因为使用了现有重建结果(本例中为真实值,但也可采用无支架约束的重建,如前一节所述)来自动推断平均支架外参和相机参数。
接着,我们按顺序匹配帧序列,因为它们是以视频形式采集的:
colmap sequential_matcher --database_path terrains/database.db
最后,我们在保持地面真实传感器装置姿态和相机参数固定的情况下,使用映射器重建场景。
mkdir -p terrains/sparse
colmap mapper \--database_path terrains/database.db \--Mapper.ba_refine_sensor_from_rig 0 \--Mapper.ba_refine_focal_length 0 \--Mapper.ba_refine_extra_params 0 \--image_path terrains/images \--output_path terrains/sparse
从360°球形图像重建
COLMAP能够通过渲染虚拟针孔图像(类似于立方体贴图)并将其视为相机阵列来处理360°全景图像集合。
由于阵列的外参和相机内参已知,重建过程更加稳健。我们提供了一个Python脚本示例来重建360°图像集合:
python python/examples/panorama_sfm.py \--input_image_path image_directory \--output_path output_directory
输出格式
https://colmap.github.io/format.html
二进制文件格式
请注意,所有二进制数据均采用小端字节序存储。由于x86处理器本身就是小端架构,因此在大多数平台上读取COLMAP二进制数据时无需特别处理。
最便捷的解析方式是通过 src/colmap/scene/reconstruction_io.h
下的C++重建API,或使用pycolmap提供的Python API。
索引与标识符
任何以*_idx
结尾的变量名都应被视为有序、连续的零基索引。
一般而言,任何以*_id
结尾的变量名应被视为无序、非连续的标识符。
例如,相机(CAMERA_ID
)、图像(IMAGE_ID
)和三维点(POINT3D_ID
)的唯一标识符都是无序的,且很可能不连续。
这也意味着最大的POINT3D_ID
并不一定对应三维点的数量,因为在重建过程中的过滤等操作会导致某些POINT3D_ID
缺失。
稀疏重建
默认情况下,COLMAP 使用二进制文件格式(机器可读、速度快)存储稀疏模型。此外,COLMAP 还提供将稀疏模型存储为文本文件(人类可读、速度慢)的选项。
无论哪种方式,相关信息都会被分割成多个文件,分别存储关于rigs
、cameras
、frames
、images
和points
的数据。
任何包含这些文件的目录即构成一个稀疏模型。二进制文件扩展名为.bin
,文本文件扩展名为.txt
。注意:当从同时包含二进制和文本文件的目录加载模型时,COLMAP 会优先选择二进制格式。
需注意旧版 COLMAP 不支持 rig 功能,因此可能缺少rigs
和frames
文件。
COLMAP 的重建 I/O 例程完全向后兼容——即使没有这些文件也能读取模型,并会自动初始化基础 rig 和 frame 结构。此外,新版输出重建的cameras
和images
文件与旧版输出完全兼容。
在 GUI 中导出当前选中模型时,选择File > Export model
。
要导出当前数据集中的所有重建模型,选择File > Export all
。
目标文件夹将包含三个核心文件,为方便起见还会包含当前项目配置(用于将模型重新导入 COLMAP)。
导入已导出模型时(例如用于可视化或继续重建),选择File > Import model
并选择包含cameras
、images
和points3D
文件的目录。
在 GUI 中转换二进制与文本格式时,可先通过File > Import model
加载模型,然后使用File > Export model
(二进制)或File > Export model as text
(文本)以目标格式导出。
此外,还能通过File > Export as...
将稀疏模型导出为其他格式,如 VisualSfM 的 NVM、Bundler 文件、PLY、VRML 等。若需通过命令行转换格式,请使用model_converter
可执行文件。
我们提供两个源代码文件方便读取稀疏重建:
- Python 脚本 (
scripts/python/read_write_model.py
支持二进制和文本格式) - Matlab 脚本 (
scripts/matlab/read_model.m
支持文本格式)
文本格式
COLMAP 为每个重建的模型导出以下三个文本文件:
rigs.txt
、cameras.txt
、frames.txt
、images.txt
和 points3D.txt
。
注释以“#”字符开头,程序会忽略这些内容。首个注释行简要描述了文本文件的格式,本页将提供更详细的说明。
rigs.txt
该文件包含已配置的设备和传感器,例如:
# Rig calib list with one line of data per calib:
# RIG_ID, NUM_SENSORS, REF_SENSOR_TYPE, REF_SENSOR_ID, SENSORS[] as (SENSOR_TYPE, SENSOR_ID, HAS_POSE, [QW, QX, QY, QZ, TX, TY, TZ])
# Number of rigs: 1
1 2 CAMERA 1 CAMERA 2 1 -0.9999701516465348 -0.0011120266840749639 -0.0075347911527510894 0.0012985125893421306 -0.19316906391350164 0.00085222218993398979 0.0070758955539026785
2 1 CAMERA 3
此处数据集包含两个设备:第一个设备配有两台相机,第二个设备配有一台相机。
cameras.txt
该文件包含数据集中所有重建相机的内参,每行对应一个相机,例如:
# Camera list with one line of data per camera:
# CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]
# Number of cameras: 3
1 SIMPLE_PINHOLE 3072 2304 2559.81 1536 1152
2 PINHOLE 3072 2304 2560.56 2560.56 1536 1152
3 SIMPLE_RADIAL 3072 2304 2559.69 1536 1152 -0.0218531
该数据集包含3台基于不同畸变模型的相机,这些相机具有相同的传感器尺寸(宽度:3072,高度:2304)。
参数长度可变,具体取决于相机型号。对于第一台相机,共有3个参数,其中单一焦距为2559.81像素,主点位于像素位置(1536, 1152)
。
相机的内参可由多张图像共享,这些图像通过唯一标识符CAMERA_ID
引用对应的相机。
frames.txt
该文件包含帧的定义,其中一帧代表装备(rig)的特定实例,可同时暴露全部或部分传感器。例如:
# Frame list with one line of data per frame:
# FRAME_ID, RIG_ID, RIG_FROM_WORLD[QW, QX, QY, QZ, TX, TY, TZ], NUM_DATA_IDS, DATA_IDS[] as (SENSOR_TYPE, SENSOR_ID, DATA_ID)
# Number of frames: 151
1 1 0.99801363919752195 0.040985139360073107 0.041890917712361225 -0.023111584553400576 -5.2666546897987896 -0.17120007823690631 0.12300519697527648 2 CAMERA 1 1 CAMERA 2 2
2 2 0.99816472047267968 0.037605501383281774 0.043101511724657163 -0.019881568259519072 -5.1956060695789192 -0.20794508616745555 0.14967533910764824 1 CAMERA 3 3
该数据集包含两个帧,其中帧1是钻机1的实例,帧2是钻机2的实例。
images.txt
该文件记录了数据集中所有重建图像的姿态和关键点信息,每幅图像对应两行数据,例如:
# Image list with two lines of data per image:
# IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME
# POINTS2D[] as (X, Y, POINT3D_ID)
# Number of images: 2, mean observations per image: 2
1 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180141.JPG
2362.39 248.498 58396 1784.7 268.254 59027 1784.7 268.254 -1
2 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180142.JPG
1190.83 663.957 23056 1258.77 640.354 59070
此处,前两行定义了第一张图像的信息,以此类推。
图像的重建姿态通过四元数 (QW, QX, QY, QZ)
和位移向量 (TX, TY, TZ)
指定,表示从世界坐标系到图像相机坐标系的投影。
该四元数采用 Hamilton 约定定义,例如 Eigen 库也使用此约定。
投影中心/相机中心的坐标由 -R^t * T
给出,其中 R^t
是由四元数构成的 3x3 旋转矩阵的逆/转置,T
为位移向量。图像的局部相机坐标系定义为:X 轴向右,Y 轴向下,Z 轴向前(以图像视角为基准)。
上述示例中的两张图像使用相同的相机模型并共享内参(CAMERA_ID = 1
)。
图像名称相对于项目选定的基准图像文件夹。第一张图像包含 3 个关键点,第二张图像包含 2 个关键点,关键点位置以像素坐标指定。
两张图像均观测到 2 个 3D 点,需注意第一张图像的最后一个关键点未观测到重建中的 3D 点(因其 3D 点标识符为 -1)。
points3D.txt
该文件包含数据集中所有重建的3D点信息,每个点占用一行,例如:
# 3D point list with one line of data per point:
# POINT3D_ID, X, Y, Z, R, G, B, ERROR, TRACK[] as (IMAGE_ID, POINT2D_IDX)
# Number of points: 3, mean track length: 3.3334
63390 1.67241 0.292931 0.609726 115 121 122 1.33927 16 6542 15 7345 6 6714 14 7227
63376 2.01848 0.108877 -0.0260841 102 209 250 1.73449 16 6519 15 7322 14 7212 8 3991
63371 1.71102 0.28566 0.53475 245 251 249 0.612829 118 4140 117 4473
此处有三个重建的3D点,其中POINT2D_IDX
定义了该关键点在images.txt
文件中的零基索引。重投影误差以像素为单位给出,且仅在全局光束法平差后更新。
密集重建
COLMAP 采用以下工作区文件夹结构:
+── images
│ +── image1.jpg
│ +── image2.jpg
│ +── ...
+── sparse
│ +── cameras.txt
│ +── images.txt
│ +── points3D.txt
+── stereo
│ +── consistency_graphs
│ │ +── image1.jpg.photometric.bin
│ │ +── image2.jpg.photometric.bin
│ │ +── ...
│ +── depth_maps
│ │ +── image1.jpg.photometric.bin
│ │ +── image2.jpg.photometric.bin
│ │ +── ...
│ +── normal_maps
│ │ +── image1.jpg.photometric.bin
│ │ +── image2.jpg.photometric.bin
│ │ +── ...
│ +── patch-match.cfg
│ +── fusion.cfg
+── fused.ply
+── meshed-poisson.ply
+── meshed-delaunay.ply
+── run-colmap-geometric.sh
+── run-colmap-photometric.sh
此处,images
文件夹存放未畸变的图像,sparse
文件夹包含未畸变相机的稀疏重建结果,stereo
文件夹存放立体重建结果。
point-cloud.ply
和 mesh.ply
是融合与网格化处理后的成果文件,而 run-colmap-geometric.sh
与 run-colmap-photometric.sh
则提供了执行密集重建的示例命令行用法。
深度图与法线图
深度图以混合文本和二进制文件的形式存储。文本头部分定义了图像的尺寸,格式为宽度&高度&通道数&
,随后是按行优先排列的float32
二进制数据。
对于深度图,通道数=1
;对于法线图,通道数=3
。您可以通过Python方便地读取深度图和法线图,使用scripts/python/read_dense.py
中的函数;
也可以通过Matlab读取,使用scripts/matlab/read_depth_map.m
和scripts/matlab/read_normal_map.m
中的函数。
一致性图
一致性图定义了图像中所有像素与其一致的源图像。
该图以混合文本和二进制文件的形式存储,其中文本部分等同于深度图和法线图,二进制部分则是连续存储的int32
值列表,格式为<行><列><N><图像索引1>...<图像索引N>
。
其中,(行, 列)
表示像素在图像中的位置,后跟一个包含N
个图像索引的列表。这些索引的排序依据images.txt
文件中的顺序指定。
数据集
https://colmap.github.io/datasets.html
以下链接提供多个不同数据集可供下载:
https://demuc.de/colmap/datasets/
- Gerrard Hall:包含100张北卡罗来纳大学教堂山分校“Gerrard”礼堂的高分辨率图像,该建筑紧邻“South”大楼。所有图像使用同一台相机搭配广角镜头拍摄,但采用不同对焦设置。
- Graham Hall:包含1273张北卡罗来纳大学教堂山分校“Graham”纪念堂内外的高分辨率图像。所有图像使用同一台相机搭配广角镜头拍摄,但采用不同对焦设置。
- Person Hall:包含330张北卡罗来纳大学教堂山分校“Person”礼堂的高分辨率图像。所有图像使用同一台相机搭配广角镜头拍摄。
- South Building:包含128张北卡罗来纳大学教堂山分校“South”大楼的图像。所有图像使用同一台相机拍摄,由Christopher Zach慷慨提供。
以下链接可查看COLMAP生成的示例重建结果:
稀疏重建:
- https://youtu.be/PmXqdfBQxfQ
- https://youtu.be/DIv1aGKqSIk
稠密重建:
- https://youtu.be/11awtGWSqQU
图形用户界面
https://colmap.github.io/gui.html
COLMAP的图形用户界面提供了对大多数可用功能的访问,并以"实时"方式可视化重建过程。
要启动图形界面,您可以运行预编译包(Windows系统:COLMAP.bat
,Mac系统:COLMAP.app
),若已安装COLMAP则执行colmap gui
命令,或从CMake构建文件夹执行./src/colmap/exe/colmap gui
。
该图形界面程序需要连接支持至少OpenGL 3.2的显示器。已注册的图像会以红色显示,重建的点云则显示从图像中提取的平均点颜色。查看器还能可视化通过多视图立体匹配生成的密集点云。
模型查看器控制
- 旋转模型:左键点击并拖动。
- 平移模型:右键或键(Mac上为键)点击并拖动。
- 缩放模型:滚动鼠标滚轮。
- 调整点大小:按住键(Mac上为键)滚动鼠标滚轮。
- 调整相机大小:按住键滚动鼠标滚轮。
- 调整裁剪平面:按住键滚动鼠标滚轮。
- 选择点:双击点(如果点太小可先调整点大小)。绿色线条会显示该点在所有可见图像中的投影位置。弹出的窗口会展示该点在所有图像中的投影位置。
- 选择相机:双击相机(如果相机太小可先调整相机大小)。紫色线条会显示与选中图像至少有一个共同点的其他图像。弹出的窗口会展示该图像的部分统计信息。
- 重置视图:要重置所有视图设置,请选择
Render > Reset view
。
渲染选项
模型查看器允许您使用不同的设置、投影方式和色彩映射等参数来渲染模型。请选择菜单项 Render > Render options
。
创建截图
要创建当前视角的截图(不包含坐标轴),请选择 Extras > Grab image
并将图像保存为您所需的格式。
创建屏幕录像
要生成重建模型的视频屏幕捕捉,请选择Extras > Grab movie
。该对话框允许您通过点击Add
来设置各个控制视点。COLMAP会在每个控制视点之间以固定帧率平滑插值线性轨迹,并在点击Add
时对配置点和相机尺寸进行插值计算。
如需调整两个视点之间的帧数或重新排序视点,可通过双击表格中相应单元格来修改视点时间。请注意,视频捕捉需要在渲染选项中设置透视投影模型。
您可以在查看器中预览轨迹(显示为浅蓝色)。完成轨迹创建后,选择Assemble movie
。
输出目录将包含视频捕捉的各个帧,可使用FFMPEG通过以下命令将其合成为视频:
ffmpeg -i frame%06d.png -r 30 -vf scale=1680:1050 movie.mp4
命令行界面
https://colmap.github.io/cli.html
命令行界面提供了访问COLMAP全部功能的自动化脚本支持。
每个核心功能都作为colmap
可执行文件的命令实现。
运行colmap -h
可列出所有可用命令(Windows系统下使用COLMAP.bat -h
)。
请注意,若从CMake构建目录运行COLMAP,可执行文件位于./src/colmap/exe/colmap
。要启动图形用户界面,请运行colmap gui
。
示例
假设您将项目的图片存储在以下结构中:
/path/to/project/...
+── images
│ +── image1.jpg
│ +── image2.jpg
│ +── ...
│ +── imageN.jpg
自动重建工具的命令应为:
# The project folder must contain a folder "images" with all the images.
$ DATASET_PATH=/path/to/project$ colmap automatic_reconstructor \--workspace_path $DATASET_PATH \--image_path $DATASET_PATH/images
请注意,任何命令都可以通过-h,--help
命令行参数列出所有可用选项。
如果您需要对重建过程的各个参数进行更精细的控制,可以执行以下命令序列作为自动重建命令的替代方案:
# The project folder must contain a folder "images" with all the images.
$ DATASET_PATH=/path/to/dataset$ colmap feature_extractor \--database_path $DATASET_PATH/database.db \--image_path $DATASET_PATH/images$ colmap exhaustive_matcher \--database_path $DATASET_PATH/database.db$ mkdir $DATASET_PATH/sparse$ colmap mapper \--database_path $DATASET_PATH/database.db \--image_path $DATASET_PATH/images \--output_path $DATASET_PATH/sparse$ mkdir $DATASET_PATH/dense$ colmap image_undistorter \--image_path $DATASET_PATH/images \--input_path $DATASET_PATH/sparse/0 \--output_path $DATASET_PATH/dense \--output_type COLMAP \--max_image_size 2000$ colmap patch_match_stereo \--workspace_path $DATASET_PATH/dense \--workspace_format COLMAP \--PatchMatchStereo.geom_consistency true$ colmap stereo_fusion \--workspace_path $DATASET_PATH/dense \--workspace_format COLMAP \--input_type geometric \--output_path $DATASET_PATH/dense/fused.ply$ colmap poisson_mesher \--input_path $DATASET_PATH/dense/fused.ply \--output_path $DATASET_PATH/dense/meshed-poisson.ply$ colmap delaunay_mesher \--input_path $DATASET_PATH/dense \--output_path $DATASET_PATH/dense/meshed-delaunay.ply
如果你想在没有连接显示器的计算机上运行COLMAP(例如集群或云服务),当系统支持时,COLMAP会自动切换至使用CUDA。
如果没有可用的CUDA设备,你可以通过设置--SiftExtraction.use_gpu 0
和--SiftMatching.use_gpu 0
选项手动选择基于CPU的特征提取和匹配功能。
帮助
可通过以下命令列出所有可用命令:
$ colmap helpUsage:colmap [command] [options]Documentation:https://colmap.github.io/Example usage:colmap help [ -h, --help ]colmap guicolmap gui -h [ --help ]colmap automatic_reconstructor -h [ --help ]colmap automatic_reconstructor --image_path IMAGES --workspace_path WORKSPACEcolmap feature_extractor --image_path IMAGES --database_path DATABASEcolmap exhaustive_matcher --database_path DATABASEcolmap mapper --image_path IMAGES --database_path DATABASE --output_path MODEL...Available commands:helpguiautomatic_reconstructorbundle_adjustercolor_extractordatabase_cleanerdatabase_creatordatabase_mergerdelaunay_mesherexhaustive_matcherfeature_extractorfeature_importerhierarchical_mapperimage_deleterimage_filtererimage_rectifierimage_registratorimage_undistorterimage_undistorter_standalonemappermatches_importermodel_alignermodel_analyzermodel_comparermodel_convertermodel_croppermodel_mergermodel_orientation_alignermodel_splittermodel_transformerpatch_match_stereopoint_filteringpoint_triangulatorpose_prior_mapperpoisson_mesherproject_generatorrig_configuratorrig_bundle_adjustersequential_matcherspatial_matcherstereo_fusiontransitive_matchervocab_tree_buildervocab_tree_matchervocab_tree_retriever
每个命令都支持 -h,--help
命令行参数来显示用法和可用选项,例如:
$ colmap feature_extractor -hOptions can either be specified via command-line or by definingthem in a .ini project file passed to ``--project_path``.-h [ --help ]--project_path arg--database_path arg--image_path arg--image_list_path arg--ImageReader.camera_model arg (=SIMPLE_RADIAL)--ImageReader.single_camera arg (=0)--ImageReader.camera_params arg--ImageReader.default_focal_length_factor arg (=1.2)--SiftExtraction.num_threads arg (=-1)--SiftExtraction.use_gpu arg (=1)--SiftExtraction.gpu_index arg (=-1)--SiftExtraction.max_image_size arg (=3200)--SiftExtraction.max_num_features arg (=8192)--SiftExtraction.first_octave arg (=-1)--SiftExtraction.num_octaves arg (=4)--SiftExtraction.octave_resolution arg (=3)--SiftExtraction.peak_threshold arg (=0.0066666666666666671)--SiftExtraction.edge_threshold arg (=10)--SiftExtraction.estimate_affine_shape arg (=0)--SiftExtraction.max_num_orientations arg (=2)--SiftExtraction.upright arg (=0)--SiftExtraction.domain_size_pooling arg (=0)--SiftExtraction.dsp_min_scale arg (=0.16666666666666666)--SiftExtraction.dsp_max_scale arg (=3)--SiftExtraction.dsp_num_scales arg (=10)
可用选项可以直接通过命令行提供,也可以通过传递给 --project_path
的 .ini
文件提供。
命令列表
以下简要说明每个命令的功能,可通过colmap [command]
调用:
gui
: 图形用户界面,详情参见图形用户界面automatic_reconstructor
: 自动为输入图像集重建稀疏和稠密模型project_generator
: 生成不同质量设置下的项目文件feature_extractor
,feature_importer
: 执行特征提取或导入图像特征exhaustive_matcher
,vocab_tree_matcher
,sequential_matcher
,spatial_matcher
,transitive_matcher
,matches_importer
:
在特征提取完成后执行特征匹配mapper
: 完成特征提取和匹配后,使用SfM技术进行稀疏3D重建/建图pose_prior_mapper
: 使用姿态先验进行稀疏3D重建/建图hierarchical_mapper
: 采用分层SfM技术进行稀疏3D重建/建图。
该方法通过将场景分割为重叠子模型并行重建,最后合并为完整重建。建议在此步骤后执行若干次点三角化和捆绑调整image_undistorter
: 校正图像畸变,并输出用于MVS或外部稠密重建软件(如CMVS/PMVS)image_rectifier
: 立体校正相机并消除图像畸变以进行立体视差估计image_filterer
: 从稀疏重建中筛选图像image_deleter
: 从稀疏重建中删除指定图像patch_match_stereo
: 运行image_undistorter
初始化工作空间后,使用MVS进行稠密3D重建/建图stereo_fusion
: 将patch_match_stereo
结果融合为彩色点云poisson_mesher
: 使用泊松表面重建算法从融合点云生成网格delaunay_mesher
: 通过Delaunay三角剖分和可见性投票的图切割算法,从稀疏或稠密点云生成网格image_registrator
: 将新图像注册到现有模型中(例如在运行mapper
后为数据库新增图像提取特征并匹配)。注意不执行捆绑调整或三角化point_triangulator
: 利用数据库中的特征匹配,对已注册图像的所有观测点进行三角化point_filtering
: 根据最小轨迹长度、最大重投影误差等条件过滤稀疏点bundle_adjuster
: 对重建场景执行全局捆绑调整(例如需要优化内参时,或在运行image_registrator
后)database_cleaner
: 清理特定或全部数据库表database_creator
: 创建带有必要模式信息的空COLMAP SQLite数据库database_merger
: 合并两个数据库为新数据库(注意相机参数不合并,且唯一标识符可能在合并过程中改变)model_analyzer
: 输出重建统计信息model_aligner
: 将模型对齐/地理配准到给定相机中心的坐标系model_orientation_aligner
: 基于曼哈顿世界假设对齐模型坐标轴model_comparer
: 比较两个重建结果的统计信息model_converter
: 将COLMAP导出格式转换为PLY/NVM等其他格式model_cropper
: 根据GPS或模型坐标系描述的边界框裁剪模型model_merger
: 尝试合并两个不连通的重建(需包含共同注册图像)model_splitter
: 按边界框坐标文件/子模型最大范围/各维度分割数,将模型划分为矩形子模型model_transformer
: 转换模型坐标系color_extractor
: 提取模型所有3D点的平均颜色rig_configurator
: 在特征提取后配置设备和帧vocab_tree_builder
: 从图像数据库构建词汇树(离线过程可重复使用)。建议使用至少10-100倍于视觉词数量的特征。预训练树可从https://demuc.de/colmap/下载,用于构建精度/速度权衡不同的自定义树vocab_tree_retriever
: 执行基于词汇树的图像检索
可视化
若需快速查看稀疏或稠密重建流程的输出结果,COLMAP 提供以下可视化方式:
- 通过
mapper
获取的稀疏点云可通过 COLMAP GUI 可视化:选择文件 > 导入模型
,然后选中包含cameras.txt
、images.txt
和points3d.txt
三个文件的目录。
- 通过
stereo_fusion
获取的稠密点云可通过 COLMAP GUI 导入fused.ply
文件进行可视化:选择文件 > 从...导入模型
,然后选中fused.ply
文件。 - 当前 COLMAP 暂不支持可视化通过
poisson_mesher
或delaunay_mesher
生成的稠密网格模型meshed-*.ply
,建议使用 Meshlab 等外部查看器进行可视化。
PyCOLMAP
https://colmap.github.io/pycolmap/index.html
PyCOLMAP 向 Python 提供了 COLMAP 的大部分功能。
安装
针对 Linux、macOS 和 Windows 的预构建 wheel 包可通过 pip 安装:
pip install pycolmap
每次发布时,wheel包会自动构建并推送到PyPI。目前这些预编译包不包含CUDA支持,如需CUDA功能需要从源码编译。按以下步骤从源码构建PyCOLMAP:
- 按照安装指南从源码安装COLMAP
- 构建PyCOLMAP:
在Linux和macOS系统上:
python -m pip install .
在Windows上,通过VCPKG安装COLMAP后,请在PowerShell中运行:
python -m pip install . `
--cmake.define.CMAKE_TOOLCHAIN_FILE="$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" `
--cmake.define.VCPKG_TARGET_TRIPLET="x64-windows"
某些功能(例如成本函数)要求以与 PyCOLMAP 相同的方式安装 PyCeres,即通过 PyPI 或从源代码安装。
API
pycolmap
https://colmap.github.io/pycolmap/pycolmap.html
Device
SensorType
sensor_t
data_t
logging
Timer
Rotation3d
AlignedBox3d
Rigid3d
get_covariance_for_inverse()
get_covariance_for_composed_rigid3d()
get_covariance_for_relative_rigid3d()
average_quaternions()
interpolate_camera_poses()
Sim3d
PosePriorCoordinateSystem
PosePrior
GPSTransfromEllipsoid
GPSTransform
pose_from_homography_matrix()
homography_decomposition()
essential_matrix_from_pose()
triangulate_point()
calculate_triangulation_angle()
TriangulatePoint()
CalculateTriangulationAngle()
triangulate_mid_point()
RANSACOptions
Bitmap
Rig
RigMap
KeysView
ValuesView
ItemsView
Point2D
Point2DList
CameraModelId
Camera
CameraMap
Frame
FrameMap
Image
ImageMap
TrackElement
Track
Point3D
Point3DMap
Correspondence
CorrespondenceGraph
Reconstruction
ReconstructionManager
TwoViewGeometryConfiguration
TwoViewGeometry
Database
DatabaseTransaction
RigConfigCamera
RigConfig
read_rig_config()
apply_rig_config()
DatabaseCache
SyntheticDatasetMatchConfig
SyntheticDatasetOptions
synthesize_dataset()
UndistortCameraOptions
undistort_camera()
undistort_image()
AbsolutePoseEstimationOptions
AbsolutePoseRefinementOptions
estimate_absolute_pose()
refine_absolute_pose()
estimate_and_refine_absolute_pose()
absolute_pose_estimation()
estimate_relative_pose()
refine_relative_pose()
estimate_affine2d()
estimate_affine2d_robust()
ImageAlignmentError
align_reconstructions_via_reprojections()
align_reconstructions_via_proj_centers()
align_reconstructions_via_points()
align_reconstruction_to_locations()
compare_reconstructions()
BundleAdjustmentGauge
BundleAdjustmentConfig
LossFunctionType
BundleAdjustmentOptions
PosePriorBundleAdjustmentOptions
BundleAdjuster
create_default_bundle_adjuster()
create_pose_prior_bundle_adjuster()
BACovarianceOptionsParams
ExperimentalPoseParam
BACovarianceOptions
BACovariance
estimate_ba_covariance_from_problem()
estimate_ba_covariance()
estimate_essential_matrix()
essential_matrix_estimation()
estimate_fundamental_matrix()
fundamental_matrix_estimation()
estimate_generalized_absolute_pose()
refine_generalized_absolute_pose()
estimate_and_refine_generalized_absolute_pose()
rig_absolute_pose_estimation()
estimate_generalized_relative_pose()
estimate_homography_matrix()
homography_matrix_estimation()
estimate_rigid3d()
estimate_rigid3d_robust()
estimate_sim3d()
estimate_sim3d_robust()
TriangulationResidualType
EstimateTriangulationOptions
estimate_triangulation()
TwoViewGeometryOptions
estimate_calibrated_two_view_geometry()
estimate_two_view_geometry()
estimate_two_view_geometry_pose()
compute_squared_sampson_error()
squared_sampson_error()
FeatureKeypoint
FeatureKeypoints
FeatureMatch
FeatureMatches
Normalization
SiftExtractionOptions
Sift
SiftMatchingOptions
ImageScore
VisualIndex
ImagePairStat
ObservationManager
IncrementalTriangulatorOptions
IncrementalTriangulator
ImageSelectionMethod
IncrementalMapperOptions
LocalBundleAdjustmentReport
IncrementalMapper
IncrementalPipelineOptions
IncrementalMapperCallback
IncrementalMapperStatus
IncrementalPipeline
CameraMode
ImageReaderOptions
CopyType
import_images()
infer_camera_from_image()
undistort_images()
extract_features()
ExhaustiveMatchingOptions
SpatialMatchingOptions
VocabTreeMatchingOptions
SequentialMatchingOptions
ImagePairsMatchingOptions
match_exhaustive()
match_spatial()
match_vocabtree()
match_sequential()
verify_matches()
PairGenerator
ExhaustivePairGenerator
VocabTreePairGenerator
SequentialPairGenerator
SpatialPairGenerator
ImportedPairGenerator
triangulate_points()
incremental_mapping()
bundle_adjustment()
PatchMatchOptions
patch_match_stereo()
StereoFusionOptions
stereo_fusion()
PoissonMeshingOptions
DelaunayMeshingOptions
poisson_meshing()
sparse_delaunay_meshing()
dense_delaunay_meshing()
set_random_seed()
ostream
Cost Functions
ReprojErrorCost()
RigReprojErrorCost()
SampsonErrorCost()
AbsolutePosePriorCost()
AbsolutePosePositionPriorCost()
RelativePosePriorCost()
Point3DAlignmentCost()
常见问题解答
https://colmap.github.io/faq.html#
调整不同重建场景和输出质量的选项
COLMAP 提供了许多可调选项,以适应不同的重建场景,并在精度、完整性与效率之间进行权衡。
默认选项设置为针对非结构化输入数据进行中高质量的重建。
系统为不同场景和质量级别预设了多种配置,可通过 GUI 中的 Extras > Set options for ...
进行设置。
若要从命令行使用这些预设,您可以在选择预设后,通过 File > Save project
保存当前选项设置。生成的工程文件可用文本编辑器打开,查看各项配置参数。此外,您也可以通过命令行运行 colmap project_generator
来生成工程文件。
扩展COLMAP
如果只需要分析COLMAP生成的稀疏或稠密重建结果,可以使用scripts/python
和scripts/matlab
目录下提供的脚本,在Python和Matlab中加载稀疏模型。
如需基于COLMAP开发C/C++可执行程序,有两种实现方式:
- 默认情况下,COLMAP头文件和库会安装到
CMAKE_INSTALL_PREFIX
目录,具体编译方法参见库安装指南 - 以
src/tools/example.cc
代码模板为基础,直接在COLMAP中实现新功能并编译为独立二进制文件
共享内参
COLMAP 支持为任意图像组和相机模型共享内参。如果图像引用的是同一台相机(通过数据库中的 camera_id
属性指定),它们就会共享相同的内参。您可以通过数据库管理工具添加新相机并设置共享内参。更多信息请参阅数据库管理。
固定内参
默认情况下,COLMAP会在重建过程中自动优化相机内参(除主点外)。
通常,如果数据集中包含足够多的图像,并且多张图像共享相同内参,通过运动恢复结构(SfM)估算出的相机内参会比使用标定板手动获取的参数更精确。
但有时COLMAP的自标定流程可能会收敛到退化参数,特别是对于具有多个畸变参数的复杂相机模型。
如果您已预先知道标定参数,可以在重建过程中固定不同的参数组。通过选择Reconstruction > Reconstruction options > Bundle Adj. > refine_*
,可以设置需要优化或保持恒定的参数组。
即使在重建过程中保持参数恒定,您仍可通过以下步骤在最终全局光束法平差中优化参数:先设置Reconstruction > Bundle adj. options > refine_*
,然后运行Reconstruction > Bundle adjustment
。
主点优化
默认情况下,COLMAP 在重建过程中会保持主点位置不变,因为主点估计通常是一个不适定问题。
当所有图像都完成重建后,问题通常已有足够约束条件,此时可以尝试在全局光束法平差中优化主点位置,特别是在多张图像共享内参的情况下。更多信息请参阅固定内参章节。
增加匹配数量/稀疏3D点
为了增加匹配数量,你应该使用更具区分度的DSP-SIFT特征替代普通SIFT,并通过以下选项估计仿射特征形状:--SiftExtraction.estimate_affine_shape=true
和 --SiftExtraction.domain_size_pooling=true
。此外,你应该启用引导特征匹配:--SiftMatching.guided_matching=true
。
默认情况下,COLMAP在三角测量中会忽略双视图特征轨迹,这会导致3D点数量少于可能值。
在罕见情况下,三角测量双视图轨迹可以通过在捆绑调整中提供额外约束来改善稀疏图像集的稳定性。
若要同时对双视图轨迹进行三角测量,请取消勾选选项:Reconstruction > Reconstruction options > Triangulation > ignore_two_view_tracks
。如果你的图像是从距离场景较远的位置拍摄的,可以尝试减小最小三角测量角度。
从已知相机位姿重建稀疏/稠密模型
如果已知相机位姿并希望重建场景的稀疏或稠密模型,您需要先手动构建一个稀疏模型。具体操作是在新文件夹下创建以下文件:
cameras.txt
points3D.txt
images.txt
+── path/to/manually/created/sparse/model
│ +── cameras.txt
│ +── images.txt
│ +── points3D.txt
points3D.txt
文件应为空,同时 images.txt
中的每隔一行也应留空,因为稀疏特征会按如下所述进行计算。关于稀疏模型结构的更多信息,可参考这篇文章。
images.txt 示例:
1 0.695104 0.718385 -0.024566 0.012285 -0.046895 0.005253 -0.199664 1 image0001.png
# Make sure every other line is left empty
2 0.696445 0.717090 -0.023185 0.014441 -0.041213 0.001928 -0.134851 2 image0002.png3 0.697457 0.715925 -0.025383 0.018967 -0.054056 0.008579 -0.378221 1 image0003.png4 0.698777 0.714625 -0.023996 0.021129 -0.048184 0.004529 -0.313427 2 image0004.png
上述每张图片必须与数据库中的image_id
(第一列)保持一致(下一步操作)。
可以通过以下两种方式检查该数据库:
- 在图形界面中查看(路径:
Database management > Processing
) - 使用colmap进行重建后,将其导出为文本格式以查看生成的images.txt文件
要重建稀疏地图,首先需要按照以下步骤从已知相机位姿的图像中重新计算特征:
colmap feature_extractor \--database_path $PROJECT_PATH/database.db \--image_path $PROJECT_PATH/images
如果已知的相机内参含有较大的畸变系数,此时应手动将cameras.txt
中的参数复制到数据库中,以便匹配器能利用这些内参。
修改数据库有多种方式,其中一种简便方法是使用提供的scripts/python/database.py
脚本。
当然,您也可以跳过此步骤,直接按以下方式继续操作:
colmap exhaustive_matcher \ # or alternatively any other matcher--database_path $PROJECT_PATH/database.dbcolmap point_triangulator \--database_path $PROJECT_PATH/database.db \--image_path $PROJECT_PATH/images--input_path path/to/manually/created/sparse/model \--output_path path/to/triangulated/sparse/model
请注意,在已知相机位姿的情况下计算稠密模型时,稀疏重建步骤并非必需。
假设您已基于已知相机位姿计算出稀疏模型,可按以下方式计算稠密模型:
colmap image_undistorter \--image_path $PROJECT_PATH/images \--input_path path/to/triangulated/sparse/model \--output_path path/to/dense/workspacecolmap patch_match_stereo \--workspace_path path/to/dense/workspacecolmap stereo_fusion \--workspace_path path/to/dense/workspace \--output_path path/to/dense/workspace/fused.ply
或者,你也可以直接生成一个密集模型,而无需先创建稀疏模型,方法如下:
colmap image_undistorter \--image_path $PROJECT_PATH/images \--input_path path/to/manually/created/sparse/model \--output_path path/to/dense/workspace
由于稀疏点云会在密集立体匹配阶段自动选择相邻图像,因此您需要按照此处所述手动指定源图像。
此外,密集立体匹配阶段现在还需要手动设置深度范围。
colmap patch_match_stereo \--workspace_path path/to/dense/workspace \--PatchMatchStereo.depth_min $MIN_DEPTH \--PatchMatchStereo.depth_max $MAX_DEPTHcolmap stereo_fusion \--workspace_path path/to/dense/workspace \--output_path path/to/dense/workspace/fused.ply
合并断开连接的模型
有时COLMAP无法将所有图像重建到同一个模型中,因此会生成多个子模型。
如果这些子模型包含共同的已配准图像,可以通过后处理步骤将它们合并为单一模型:
colmap model_merger \--input_path1 /path/to/sub-model1 \--input_path2 /path/to/sub-model2 \--output_path /path/to/merged-model
为提高两个子模型间的对齐质量,建议在合并后再次运行全局光束法平差:
colmap bundle_adjuster \--input_path /path/to/merged-model \--output_path /path/to/refined-merged-model
地理配准
通过为部分或全部已配准图像的相机中心提供3D位置,可以实现模型的地理配准。根据这些对应关系,可以确定重建模型与地理配准目标坐标系之间的3D相似性变换。
地理配准的3D坐标既可以从数据库(tvec_prior字段)提取,也可以从用户指定的文本文件中获取。对于文本文件,必须按照以下格式指定图像相机中心的地理配准3D坐标:
image_name1.jpg X1 Y1 Z1
image_name2.jpg X2 Y2 Z2
image_name3.jpg X3 Y3 Z3
...
坐标可以是基于GPS的(纬度/经度/高度)或基于笛卡尔的(x/y/z)。
对于GPS坐标,系统会执行转换将其转为笛卡尔坐标。
转换方式支持从GPS到ECEF(地心地固坐标系)或ENU(东-北-天坐标系)。
若使用ENU坐标,首张图像的GPS坐标将作为ENU坐标系的原点。
系统也支持先使用ECEF坐标进行对齐,再将对齐后的重建结果旋转至ENU平面。
注意:至少需要指定3张图像才能估算3D相似变换。之后,可通过以下方式对模型进行地理配准:
colmap model_aligner \--input_path /path/to/model \--output_path /path/to/geo-registered-model \--ref_images_path /path/to/text-file (or --database_path /path/to/database.db) \--ref_is_gps 1 \--alignment_type ecef \--alignment_max_error 3.0 (where 3.0 is the error threshold to be used in RANSAC)
将使用RANSAC估计器计算3D相似变换,以提高对数据中潜在异常值的鲁棒性。需要提供用于RANSAC估计器的误差阈值。
曼哈顿世界坐标系对齐
COLMAP 提供了一项功能,可以根据曼哈顿世界假设来对齐重建场景的坐标轴。
也就是说,COLMAP 能够通过图像中的消失点检测,自动确定曼哈顿世界的重力轴和主要水平轴。更多细节请参考 model_orientation_aligner
。
图像区域掩码处理
COLMAP在特征提取阶段支持通过两种不同方式对关键点进行掩码处理:
- 通过
mask_path
参数指定包含图像掩码的文件夹。对于每张输入图像,其对应的掩码文件必须保持与原始图像相同的相对路径结构,即在image_path
下的子路径应与mask_path
下的子路径一致。
文件名需完全相同,仅需额外添加.png
扩展名。例如,若图像路径为image_path/abc/012.jpg
,则对应掩码文件应为mask_path/abc/012.jpg.png
。 - 通过
camera_mask_path
参数指定单一掩码图像。该掩码将统一应用于所有输入图像。
无论采用哪种方式,在掩码图像中黑色区域(灰度像素强度值为0的区域)将不会进行特征提取。
将新图像注册/定位到现有重建中
如果您已有一组图像的重建结果,并希望在该重建中注册/定位新图像,可以按照以下步骤操作:
colmap feature_extractor \--database_path $PROJECT_PATH/database.db \--image_path $PROJECT_PATH/images \--image_list_path /path/to/image-list.txtcolmap vocab_tree_matcher \--database_path $PROJECT_PATH/database.db \--VocabTreeMatching.match_list_path /path/to/image-list.txtcolmap image_registrator \--database_path $PROJECT_PATH/database.db \--input_path /path/to/existing-model \--output_path /path/to/model-with-new-imagescolmap bundle_adjuster \--input_path /path/to/model-with-new-images \--output_path /path/to/model-with-new-images
请注意,该流程首先会提取新图像的特征,然后将其与数据库中现有图像进行匹配,最后将这些图像注册到模型中。
图像列表文本文件包含待提取和匹配的图像列表,每行指定一个图像文件名。捆绑调整(bundle adjustment)是可选项。
如果您需要通过三角测量实现更精确的图像配准,那么您应该重启或继续重建流程,而非仅仅将图像注册到模型中。此时不应运行 image_registrator
,而应运行 mapper
从现有模型继续重建流程:
colmap mapper \--database_path $PROJECT_PATH/database.db \--image_path $PROJECT_PATH/images \--input_path /path/to/existing-model \--output_path /path/to/model-with-new-images
或者,您也可以选择从头开始重建:
colmap mapper \--database_path $PROJECT_PATH/database.db \--image_path $PROJECT_PATH/images \--output_path /path/to/model-with-new-images
请注意,在运行 mapper
或 bundle_adjuster
后,必须从头开始重新运行密集重建,因为这些步骤可能会改变模型的坐标系。
无GPU/CUDA时的可用功能
若您没有支持CUDA的GPU但拥有其他类型GPU,除密集重建部分外,您仍可使用COLMAP的所有功能。此时可参考教程采用外部密集重建软件作为替代方案。
若您的GPU算力较低,或需要在无外接显示器且不支持CUDA的设备上运行COLMAP,可通过指定相应参数(例如在特征提取阶段使用--SiftExtraction.use_gpu=false
)强制所有步骤在CPU上执行。但需注意,这可能导致重建流程显著变慢。
特别提醒:默认设置下,CPU执行特征提取时处理大尺寸图像可能占用过量内存。此时需手动通过以下方式降低资源消耗:
- 使用
--SiftExtraction.max_image_size
限制最大图像尺寸 - 设置
--SiftExtraction.first_octave 0
- 通过
--SiftExtraction.num_threads
限制线程数量
特征提取/匹配中的多GPU支持
您可以通过为支持CUDA的GPU指定多个索引来在多块GPU上并行运行特征提取/匹配任务。
例如,使用--SiftExtraction.gpu_index=0,1,2,3
和--SiftMatching.gpu_index=0,1,2,3
参数可以在4块GPU上并行执行特征提取/匹配操作。
需要注意的是,每块GPU只能运行一个线程,而这种配置通常也能提供最佳性能。
默认情况下,COLMAP会为每块支持CUDA的GPU启动一个特征提取/匹配线程。与在同一块GPU上运行多个线程相比,这种默认配置通常能获得更好的性能表现。
特征匹配因非法内存访问失败
如果遇到以下错误信息:
MultiplyDescriptor: an illegal memory access was encountered
或者出现以下情况:
错误:特征匹配失败。这可能是由于GPU内存不足导致的。建议减少最大特征数量。
在特征匹配过程中,您的GPU内存耗尽。尝试逐步降低选项--SiftMatching.max_num_matches
的值,直到错误消失。
请注意,这可能导致特征匹配结果变差,因为为了适应GPU内存容量,低尺度的输入特征将被截断。
另一种方案是改用基于CPU的特征匹配,但这会显著降低处理速度。更理想的解决方案是升级配备更大内存的GPU。
所需的最大GPU内存可通过以下公式近似估算:4 * num_matches * num_matches + 4 * num_matches * 256
。
例如,若设置--SiftMatching.max_num_matches 10000
,所需的最大GPU内存约为400MB。需注意,该内存仅在图像实际包含对应数量特征时才会被分配。
密集重建中完整性与准确性的权衡
如果密集点云包含过多离群点和噪声,尝试增大 --StereoFusion.min_num_pixels
选项的值。
如果使用泊松重建生成的密集表面网格模型没有表面或存在过多离群表面,应降低 --PoissonMeshing.trim
选项的值以减少表面面积,反之则增大该值。
同时建议按照上文所述,尝试在融合阶段减少离群点或提高完整性。
如果使用德劳内重建生成的密集表面网格模型表面噪声过多或不完整,应增大 --DenaunayMeshing.quality_regularization
参数以获得更平滑的表面。
若网格分辨率过于粗糙,则需将 --DelaunayMeshing.max_proj_dist
选项调至更小值。
提升弱纹理表面的密集重建效果
对于弱纹理表面的场景,采用高分辨率的输入图像(--PatchMatchStereo.max_image_size
)和较大的匹配窗口半径(--PatchMatchStereo.window_radius
)会有所帮助。
您还可以考虑降低光度一致性代价的过滤阈值(--PatchMatchStereo.filter_min_ncc
)。
表面网格重建
COLMAP支持两种表面重建算法:基于泊松表面重建[kazhdan2013]和基于图割的Delaunay三角剖分表面提取。泊松重建通常要求输入点云几乎没有离群点,当输入数据存在离群点或大范围缺失时,往往会产生质量较差的表面。
相比之下,基于Delaunay三角剖分的网格化算法对离群点更具鲁棒性,且通常比泊松算法更能适应大规模数据集,但其生成的表面平滑度较低。
此外,该算法可同时应用于稀疏和稠密重建结果。若需提升表面平滑度,可采用MeshLab等工具实现的拉普拉斯平滑作为后处理步骤。
值得注意的是,这两种算法可以组合使用:先通过Delaunay网格化从稀疏/稠密点云中鲁棒地滤除离群点,再执行泊松表面重建以获得平滑表面。
加速密集重建
可以通过多种方式加快密集重建的速度:
- 在系统中增加更多GPU,因为在立体重建步骤中密集重建可以利用多块GPU。
同时增加系统内存容量,并将--PatchMatchStereo.cache_size
和--StereoFusion.cache_size
参数调至最大值,以加速密集融合步骤。 - 禁用几何一致性密集立体重建
--PatchMatchStereo.geom_consistency false
。此时需确保启用--PatchMatchStereo.filter true
参数。 - 降低
--PatchMatchStereo.max_image_size
和--StereoFusion.max_image_size
的数值,以限定进行密集重建的最大图像分辨率。 - 减少每张参考图像需处理的源图像数量,具体方法参见此处。
- 将匹配窗口步长
--PatchMatchStereo.window_step
设为2。 - 缩小匹配窗口半径
--PatchMatchStereo.window_radius
。 - 减少匹配迭代次数
--PatchMatchStereo.num_iterations
。 - 减少采样视角数量
--PatchMatchStereo.num_samples
。 - 对于超大规模重建任务,可使用CMVS工具将场景分割为多个聚类并剔除冗余图像,从而加速密集立体匹配和融合步骤,详见此处。
请注意:除硬件升级外,上述调整可能会降低密集重建结果的质量。当取消立体重建进程并重新启动时,先前进度不会丢失,已处理的视图将被自动跳过。
降低密集重建时的内存占用
如果在进行块匹配立体匹配(patch match stereo)时GPU内存不足,可以通过以下两种方式解决:
- 通过设置选项
--PatchMatchStereo.max_image_size
减小最大图像尺寸 - 在
stereo/patch-match.cfg
文件中减少源图像数量,例如将__auto__, 30
改为__auto__, 10
注意:启用 geom_consistency
选项会增加GPU内存需求。
如果在立体匹配或融合阶段出现CPU内存不足,可以:
- 降低以GB为单位的
--PatchMatchStereo.cache_size
或--StereoFusion.cache_size
值 - 减小
--PatchMatchStereo.max_image_size
或--StereoFusion.max_image_size
参数值
注意:设置过低的缓存值可能导致处理速度极慢并加重硬盘负载。
对于数千张图像的大规模重建任务,建议:
- 使用CMVS [furukawa10] 将稀疏重建拆分为更易管理的图像簇
- CMVS可自动剔除观测相同场景元素的冗余图像
注意:
- COLMAP的密集重建流程支持命令行模式下使用PMVS/CMVS文件夹结构
- 参考工作区文件夹中的示例shell脚本(仅当输出类型设为PMVS时才会生成PMVS/CMVS脚本)
- 由于CMVS会产生高度重叠的簇,建议根据系统资源和速度需求,将默认的每簇100张图像提高到尽可能大的值
修改CMVS图像数量需调整shell脚本参数,例如:
cmvs pmvs/ 500
表示限制每簇500张图像- 若只需剔除冗余图像而不进行场景分簇,可将该数值设为极大值
密集重建过程中手动指定源图像
您可以通过修改 stereo/patch-match.cfg
文件中的源图像数量参数来实现,例如将 __auto__, 30
改为 __auto__, 10
。
该设置会自动选择视觉重叠度最高的图像作为源图像。
若需使用所有其他图像作为源图像,可指定 __all__
参数。此外,您还可以通过直接输入图像名称的方式手动指定源图像,例如:
image1.jpg
image2.jpg, image3.jpg
image2.jpg
image1.jpg, image3.jpg
image3.jpg
image1.jpg, image2.jpg
在这里,image2.jpg
和 image3.jpg
被用作 image1.jpg
等图像的源文件。
密集重建中的多GPU支持
您可以通过为支持CUDA的GPU指定多个索引来在多个GPU上运行密集重建。
例如,--PatchMatchStereo.gpu_index=0,1,2,3
表示在4个GPU上并行运行密集重建。
您还可以通过重复指定相同的GPU索引来在同一GPU上运行多个密集重建线程,例如--PatchMatchStereo.gpu_index=0,0,1,1,2,3
。默认情况下,COLMAP会为每个支持CUDA的GPU运行一个密集重建线程。
解决密集重建过程中的GPU冻结和超时问题
立体重建流程通过CUDA在GPU上运行,会给GPU带来高负载。在重建过程中,可能会出现显示冻结甚至程序崩溃的情况。
针对此问题,您可以使用系统中的副GPU(通过显式设置GPU索引,通常索引0对应连接显示器的显卡)来避免干扰。另一种方案是增加系统的GPU超时设置,具体如下。
默认情况下,Windows操作系统会检测GPU的响应问题,并通过重置显卡并中止立体重建进程来恢复桌面功能。解决方案是将所谓的"超时检测与恢复"(TDR)延迟时间调大。
请参阅NVIDIA Nsight文档或微软官方文档了解如何在Windows系统中调整延迟时间。您可以通过修改以下Windows注册表项来增加延迟:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers]
"TdrLevel"=dword:00000001
"TdrDelay"=dword:00000120
要设置注册表项,请使用管理员权限执行以下命令(例如在 cmd.exe
或 powershell.exe
中):
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers /v TdrLevel /t REG_DWORD /d 00000001
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers /v TdrDelay /t REG_DWORD /d 00000120
为了使更改生效,请随后重启您的机器。
Linux/Unix下的X窗口系统具备类似功能,并能检测GPU的响应问题。在X窗口系统下避免超时问题的最简单解决方案是关闭它,并通过命令行运行立体重建。在Ubuntu系统下,您可以使用以下命令首先停止X:
sudo service lightdm stop
然后从命令行运行密集重建代码:
colmap patch_match_stereo ...
最后,你可以用以下命令重启桌面环境:
sudo service lightdm start
如果经过上述更改后,密集重建仍然崩溃,原因很可能是GPU内存不足,正如本列表中另一项所讨论的那样。
更新日志
https://colmap.github.io/changelog.html
COLMAP 3.12.0 (2025年6月30日)
新特性
- 新增对传感器组(包括多相机组和全景设备)建模的支持。更多详情及使用示例请参阅:https://colmap.github.io/rigs.html。
- 自动下载并缓存词汇树及其他资源。
- 支持LLA与UTM坐标系的相互转换。
- 改进了仿射变换和广义绝对/相对位姿的最小化解算器。
- 通过在图像空间中最小化像素误差,提升了绝对位姿估计的精度。
- 将FLANN替换为faiss以实现快速近似最近邻搜索,从而提升基于CPU的特征匹配和基于词汇树的图像检索速度。
- 新增相对位姿协方差传递功能。
- 支持可视化具有任意原点与比例尺的模型(例如GPS空间中的模型)。
- 新增针对ETH3D、IMC、BlendedMVS数据集的重建基准测试。
- 在持续集成中测量并报告代码测试覆盖率。
错误修复
- 修复了RANSAC停止准则的问题,详见论文链接。
- 修复并改进了双视角位姿估计和三角测量角度计算。
- 修复了词汇树特征匹配时可能出现的罕见死锁问题。
- 其他错误修复内容,请查看下方完整变更列表。
重大变更
-
重建和数据库的序列化引入了新的抽象概念:rigs(设备组)和frames(帧)。重建输出现在包含两个新文件:rigs.{bin,txt}和frames.{bin,txt}。数据库新增了以下表:rigs、rig_sensors、frames、frames_data。读取现有的重建数据和数据库(不含rigs/frames)完全向后兼容,反之使用旧代码读取新的重建数据(含rigs/frames)也完全向前兼容。
-
传感器位姿(以及图像位姿)现在通过以下方式组合:sensor_from_world = sensor_from_rig * rig_from_world。此前,image.cam_from_world返回的是位姿参数的引用,现在改为返回位姿组合的副本:image.cam_from_world() = image.frame.rig.sensor_from_rig(image.camera.sensor_id) * image.frame.rig_from_world,基础位姿参数存储在rig和frame对象中。
-
默认的bundle adjuster现已支持传感器设备组,因此rig bundle adjuster已被弃用。
-
基于FLANN的词汇树与faiss不兼容。若未提供vocab_tree_path参数,系统会自动下载新版本词汇树,否则需要手动下载更新。
-
移除了对Ubuntu 20.04、MacOS 13和Visual Studio 2019的官方支持。
完整变更列表(按时间排序)
- 由 @ahojnnes 在推送时取消之前的 GitHub Action 运行 https://github.com/colmap/colmap/pull/2998
- 修复 pycolmap Windows CI 中的 ccache 安装问题 @ahojnnes https://github.com/colmap/colmap/pull/2997
- 使用 Azure Blob 存储作为 vcpkg 二进制缓存 @ahojnnes https://github.com/colmap/colmap/pull/2999
- 在检索中添加缺失的 OpenMP 标志以实现 FLANN 并行化 @ahojnnes https://github.com/colmap/colmap/pull/3018
- 为 vcpkg 二进制缓存分离读写 SAS 令牌 @ahojnnes https://github.com/colmap/colmap/pull/3027
- 内联定义 vcpkg 二进制缓存源 @ahojnnes https://github.com/colmap/colmap/pull/3028
- 修复 bash 中条件性 vcpkg 二进制缓存配置 @ahojnnes https://github.com/colmap/colmap/pull/3031
- 避免安装包含目录时使用绝对路径 @jhacsonmeza https://github.com/colmap/colmap/pull/3024
- 添加 LLA 与 UTM 坐标之间的转换 @StonerLing https://github.com/colmap/colmap/pull/3030
- 改进 ReadWriteBinaryBlob 接口并添加测试 @ahojnnes https://github.com/colmap/colmap/pull/3033
- 添加文件下载支持 @ahojnnes https://github.com/colmap/colmap/pull/3022
- 添加计算 sha256 摘要的函数 @ahojnnes https://github.com/colmap/colmap/pull/3035
- 自动下载并缓存词汇树 @ahojnnes https://github.com/colmap/colmap/pull/3036
- 设置 vcpkg 默认特性并同步至最新 vcpkg @ahojnnes https://github.com/colmap/colmap/pull/3038
- 在 Percentile/Median 中避免不必要的输入元素复制 @ahojnnes https://github.com/colmap/colmap/pull/3039
- 抽象算法类 IncrementalMapperImpl @B1ueber2y https://github.com/colmap/colmap/pull/3040
- 在百分位数计算中执行线性插值 @ahojnnes https://github.com/colmap/colmap/pull/3041
- 在 IncrementalMapperImpl 中避免依赖输入 @B1ueber2y https://github.com/colmap/colmap/pull/3043
- 在 EndReconstruction 中重新排序析构函数以提高安全性 @B1ueber2y https://github.com/colmap/colmap/pull/3046
- 改进重建归一化/边界框/质心处理 @ahojnnes https://github.com/colmap/colmap/pull/3047
- 加速仿射变换最小求解器,创建 Python 绑定 @ahojnnes https://github.com/colmap/colmap/pull/3049
- 修复 DOWNLOAD_ENABLED=OFF 时的编译问题 @ahojnnes https://github.com/colmap/colmap/pull/3053
- 统一 rigid3d/sim3d/affine2d 接口/测试,为 rigid3d 添加 pycolmap 绑定 @ahojnnes https://github.com/colmap/colmap/pull/3051
- 改进特征提取中掩码错误的日志记录 @Ambrosiussen https://github.com/colmap/colmap/pull/3034
- 为与求解器相关的 ceres 绑定添加拷贝构造函数支持 @B1ueber2y https://github.com/colmap/colmap/pull/3059
- 修复使用 pycolmap 捆绑调整器与 pyceres 时的次要问题 @B1ueber2y https://github.com/colmap/colmap/pull/3060
- 重新启用从 Ceres::Problem 实例估计协方差的接口支持 @B1ueber2y https://github.com/colmap/colmap/pull/3061
- 仅在 PR 中取消 CI 运行,不在主分支/发布分支中执行 @ahojnnes https://github.com/colmap/colmap/pull/3063
- 为 pycolmap ID 类型中的无效值添加绑定支持 @B1ueber2y https://github.com/colmap/colmap/pull/3072
- 修复 ETH3D 基准测试中的自定义质量级别问题 @ahojnnes https://github.com/colmap/colmap/pull/3076
- 根据质量级别自动设置 max_num_features @ahojnnes https://github.com/colmap/colmap/pull/3077
- 即使未安装 CUDA 也能构建 MVS 文档 @sarlinpe https://github.com/colmap/colmap/pull/3078
- 临时禁用 pycolmap macOS CI 中的 ccache @sarlinpe https://github.com/colmap/colmap/pull/3084
- 在自动重建中添加指定图像列表的选项 @ahojnnes https://github.com/colmap/colmap/pull/3074
- 仅在必要时在自动重建中创建 OpenGL 上下文 @ahojnnes https://github.com/colmap/colmap/pull/3075
- 移除 pycolmap/covariance 中初始化器周围不必要的花括号 @ahojnnes https://github.com/colmap/colmap/pull/3080
- 移除 macOS CI 的临时修复 @sarlinpe https://github.com/colmap/colmap/pull/2954
- 重建基准测试 @ahojnnes https://github.com/colmap/colmap/pull/2714
- 重新启用 pycolmap Mac CI 中的 ccache @sarlinpe https://github.com/colmap/colmap/pull/3085
- 修复增量三角测量中的传递性完成问题 @ahojnnes https://github.com/colmap/colmap/pull/3094
- 修复图像删除,删除后隐藏点查看器部件 @ahojnnes https://github.com/colmap/colmap/pull/3098
- 修复 Windows 下的下载功能 @ahojnnes https://github.com/colmap/colmap/pull/3099
- 重新添加协方差估计的详细日志 @B1ueber2y https://github.com/colmap/colmap/pull/3082
- 修复相机装备成本函数中的重投影误差 @binbin-xu https://github.com/colmap/colmap/pull/3106
- 在 dockerfile 中安装缺失的 libcurl4 运行时库 @ahojnnes https://github.com/colmap/colmap/pull/3122
- 在 pycolmap 中公开增量映射器姿态先验选项 @ahojnnes https://github.com/colmap/colmap/pull/3123
- 从版权中移除年份 @ahojnnes https://github.com/colmap/colmap/pull/3124
- 使用 poselib 进行广义绝对姿态最小求解 @ahojnnes https://github.com/colmap/colmap/pull/3125
- 添加代码覆盖率报告 @ahojnnes https://github.com/colmap/colmap/pull/3126
- 当 stddev=0 时修复合成先验生成 @ahojnnes https://github.com/colmap/colmap/pull/3128
- 在系统测试目录下创建临时 colmap 测试目录 @ahojnnes https://github.com/colmap/colmap/pull/3129
- 次要:运行 pycolmap 捆绑调整器不再必须依赖 pyceres @B1ueber2y https://github.com/colmap/colmap/pull/3130
- 修复基准测试的成本函数约定 @B1ueber2y https://github.com/colmap/colmap/pull/3131
- 支持从字符串转换枚举 @ahojnnes https://github.com/colmap/colmap/pull/3132
- 更稳健地处理退化三角测量角度 @ahojnnes https://github.com/colmap/colmap/pull/3135
- 次要:在对齐测试脚本中添加缺失的空命名空间 @B1ueber2y https://github.com/colmap/colmap/pull/3137
- 为未来装备支持添加帧实现 @B1ueber2y https://github.com/colmap/colmap/pull/2698
- 将 RigCalibration 重命名为 RigCalib @ahojnnes https://github.com/colmap/colmap/pull/3142
- 修复并改进双视图姿态和三角测量角度估计 @ahojnnes https://github.com/colmap/colmap/pull/3146
- 修复姿态逆的协方差传播 @B1ueber2y https://github.com/colmap/colmap/pull/3155
- [球形相机支持] 更改本质矩阵估计以使用相机光线 @ahojnnes https://github.com/colmap/colmap/pull/3159
- 改进增量映射器初始化逻辑 @ahojnnes https://github.com/colmap/colmap/pull/3161
- 改进 RANSAC 依赖注入 @ahojnnes https://github.com/colmap/colmap/pull/3165
- 添加关于 COLMAP 中协方差传播左约定的文档 @B1ueber2y https://github.com/colmap/colmap/pull/3167
- 在文档中添加 docker 指令链接 @j3soon https://github.com/colmap/colmap/pull/3169
- 在图像空间中计算绝对姿态估计误差 @ahojnnes https://github.com/colmap/colmap/pull/3166
- 添加支持传播相对姿态协方差 @B1ueber2y https://github.com/colmap/colmap/pull/3168
- 避免在 pycolmap 头文件中使用命名空间 @ahojnnes https://github.com/colmap/colmap/pull/3173
- 修复交叉协方差的命名并添加相对姿态协方差接口 @B1ueber2y https://github.com/colmap/colmap/pull/3170
- 相机模型执行有效投影测试 @ahojnnes https://github.com/colmap/colmap/pull/3172
- 对 pycolmap 的各种改进和扩展 @ahojnnes https://github.com/colmap/colmap/pull/3176
- 修复 pycolmap CI 构建以支持拉取请求 @B1ueber2y https://github.com/colmap/colmap/pull/3178
- 更改 CamFromImg 以返回可选光线 @ahojnnes https://github.com/colmap/colmap/pull/3180
- 三角测量操作基于相机光线 @ahojnnes https://github.com/colmap/colmap/pull/3184
- 为视觉索引添加 Python 绑定 @ahojnnes https://github.com/colmap/colmap/pull/3185
- 按正确顺序定义绑定 @sarlinpe https://github.com/colmap/colmap/pull/3189
- 恢复 CamFromImg 返回归一化相机坐标而非… @ahojnnes https://github.com/colmap/colmap/pull/3193
- 为重建+数据库添加装备序列化支持 @ahojnnes https://github.com/colmap/colmap/pull/3143
- 从主分支拉取更改 @ahojnnes https://github.com/colmap/colmap/pull/3194
- 修复可能未初始化的警告 @papjuli https://github.com/colmap/colmap/pull/3199
- 修复与 PoissonRecon 的编译错误 @theartful https://github.com/colmap/colmap/pull/3200
- 从 CI 中移除 Ubuntu 20.04 @sarlinpe https://github.com/colmap/colmap/pull/3203
- 添加帧序列化支持 @ahojnnes https://github.com/colmap/colmap/pull/3202
- 在捆绑调整中处理非平凡帧 @ahojnnes https://github.com/colmap/colmap/pull/3214
- 更新电子邮件地址 @sarlinpe https://github.com/colmap/colmap/pull/3223
- 更改 Python 包的根目录 @sarlinpe https://github.com/colmap/colmap/pull/3217
- 修复切换渲染时的错误 @ahojnnes https://github.com/colmap/colmap/pull/3230
- 为帧图像 ID 添加便利迭代器 @ahojnnes https://github.com/colmap/colmap/pull/3231
- 使用主分支更新 feature/rig @ahojnnes https://github.com/colmap/colmap/pull/3241
- 更新至最新 vcpkg @ahojnnes https://github.com/colmap/colmap/pull/3243
- 使用主分支的最新更改更新 feature/rig 分支 @ahojnnes https://github.com/colmap/colmap/pull/3244
- 修复增量 pycolmap 构建脚本 @ahojnnes https://github.com/colmap/colmap/pull/3245
- 逻辑分组图像读取器选项 @ahojnnes https://github.com/colmap/colmap/pull/3246
- 修复链式匹配合成 @ahojnnes https://github.com/colmap/colmap/pull/3248
- 弃用 Reconstruction::IsImageRegistered 以支持现有的 Image::HasPose @ahojnnes https://github.com/colmap/colmap/pull/3247
- 修复双视图几何姿态估计中的单应性问题 @ahojnnes https://github.com/colmap/colmap/pull/3250
- 修复未初始化变量警告 @ahojnnes https://github.com/colmap/colmap/pull/3254
- 在构建时包含 Boost 头文件 @jonahjnewton https://github.com/colmap/colmap/pull/3257
- 从主分支拉取最新更改到 feature/rig @ahojnnes https://github.com/colmap/colmap/pull/3262
- 在增量映射器中支持装备/帧 @ahojnnes https://github.com/colmap/colmap/pull/3238
- 将 FrameFromWorld 重命名为 RigFromWorld 姿态 @ahojnnes https://github.com/colmap/colmap/pull/3263
- 在 CI 中添加对端到端 Python 管道的 pytest @B1ueber2y https://github.com/colmap/colmap/pull/3266
- 修复损坏的 Python 接口 @B1ueber2y https://github.com/colmap/colmap/pull/3267
- 对非平凡帧使用广义绝对姿态估计 @ahojnnes https://github.com/colmap/colmap/pull/3265
- 修复装备帧的颜色提取 @ahojnnes https://github.com/colmap/colmap/pull/3268
- 序列匹配器扩展装备图像 @ahojnnes https://github.com/colmap/colmap/pull/3270
- 修复 pycolmap README 中已弃用接口的使用 @B1ueber2y https://github.com/colmap/colmap/pull/3272
- 改进装备配置的代码/文档和测试 @ahojnnes https://github.com/colmap/colmap/pull/3275
- 更新 vcpkg 以引入 ceres 的修复 @ahojnnes https://github.com/colmap/colmap/pull/3276
- 装备捆绑调整器使用默认捆绑调整例程 @ahojnnes https://github.com/colmap/colmap/pull/3281
- 清理遗留相机装备代码 @ahojnnes https://github.com/colmap/colmap/pull/3283
- 将装备传感器和帧数据存储在单独的数据库表中 @ahojnnes https://github.com/colmap/colmap/pull/3285
- 在特征提取期间配置平凡装备和帧 @ahojnnes https://github.com/colmap/colmap/pull/3287
- [Bugfix] 为未知焦距的绝对姿态估计通过主点居中 2D 点 @xjiangan https://github.com/colmap/colmap/pull/3289
- 为装备配置添加绑定 @ahojnnes https://github.com/colmap/colmap/pull/3291
- 装备支持的文档 @ahojnnes https://github.com/colmap/colmap/pull/3290
- 修复 rigs.txt 的文档 @sarlinpe https://github.com/colmap/colmap/pull/3292
- 使用主分支的最新更改更新 feature/rig @ahojnnes https://github.com/colmap/colmap/pull/3293
- 将 feature/rig 分支合并到主分支 @ahojnnes https://github.com/colmap/colmap/pull/3295
- 提高装备示例的清晰度 @B1ueber2y https://github.com/colmap/colmap/pull/3297
- 绑定缺失的 SequentialMatchingOptions.loop_detection_period @
COLMAP 3.11.1 (2024年12月6日)
错误修复
- 修复了
pycolmap
函数align_reconstruction_to_locations
接口中的拼写错误,由 @B1ueber2y 提交于 https://github.com/colmap/colmap/pull/2961 - 重新添加了一些 Ceres 绑定,以便在不使用
pyceres
的情况下通过pycolmap
进行捆绑调整,由 @B1ueber2y 提交于 https://github.com/colmap/colmap/pull/2985 - 修复了位姿先验 BA 对齐中 RANSAC 最大误差的设置问题,由 @ahojnnes 提交于 https://github.com/colmap/colmap/pull/2993
COLMAP 3.11.0 (2024年11月28日发布)
新特性
- 新增基于位姿先验的增量式映射器,可利用来自GPS测量等绝对位姿先验信息。
- 新增束调整协方差估计功能,速度显著快于Ceres且鲁棒性更强。
- 提供pycolmap的API文档及自动生成的代码存根。
- 采用PoseLib的最小求解器以提升运行速度和算法鲁棒性。
- 实验性支持通过Ceres进行CUDA加速的束调整(默认禁用)。
- 新增支持读取16位PNG灰度图像。
- 为Meta的Project Aria设备新增RAD_TAN_THIN_PRISM_FISHEYE相机模型。
- 在图像去畸变中用解析雅可比矩阵替代数值计算,以获得更好的收敛性。
- 更多性能优化及其他改进,完整变更列表见下文。
问题修复
- 修复了CUDA SIFT特征提取器的非确定性行为。该问题自3.10版本起存在。
- 修正了协变/仿射SIFT特征提取器的方向检测功能。此问题自初始版本即存在。
- 解决了点三角测量器因观测管理器中的错误而崩溃的问题。该缺陷自3.10版本引入。
- 修复了序列特征匹配器遗漏最远图像的重叠区域问题。此错误自初始版本即存在。
- 解决了因并发数据库访问导致的罕见匹配死锁情况。该问题自3.10版本起存在。
- 修正了大端/小端检测机制。此问题自3.1版本即存在。
- 其他修复内容请参阅下方的完整变更列表。
重大变更
- 停止对 Ubuntu 18.04 和 Visual Studio 2019 的官方支持
- C++ 代码升级至 C++17 标准,CUDA 源码升级至 C++14 标准
- 数据库新增
pose_priors
表以支持基于位姿先验的映射器 - PyCOLMAP API 变更:
align_reconstrution_to_locations
更名为align_reconstruction_to_locations
(修正拼写错误)pycomap.cost_functions
改为模块形式,需显式导入:import pycolmap.cost_functions
- 用
Image.{has_pose,reset_pose}
替代Image.registered
- 用
Image.{get_observation_point2D_idxs,get_observation_points2D}
替代Image.{get_valid_point2D_ids,get_valid_points2D}
- 用
Track.{add_element,delete_element}
替代Track.{append,remove}
AbsolutePoseErrorCost
更名为AbsolutePosePriorCost
MetricRelativePoseErrorCost
更名为RelativePosePriorCost
- 修改了
ReprojErrorCost
及相关代价函数的签名:参数顺序调整,检测不确定性现为 2x2 协方差矩阵 BundleAdjuster
改为虚类,需通过pycolmap.create_default_bundle_adjuster()
创建absolute_pose_estimation
更名为estimate_and_refine_absolute_pose
pose_refinement
更名为refine_absolute_pose
essential_matrix_estimation
更名为estimate_essential_matrix
fundamental_matrix_estimation
更名为estimate_fundamental_matrix
rig_absolute_pose_estimation
更名为estimate_and_refine_generalized_absolute_pose
homography_matrix_estimation
更名为estimate_homography_matrix
squared_sampson_error
更名为compute_squared_sampson_error
homography_decomposition
更名为pose_from_homography_matrix
Rigid3d.essential_matrix
改为pycolmap.essential_matrix_from_pose
完整变更列表(按时间排序)
- 由 @ahojnnes 更新 pycolmap 相关内容 https://github.com/colmap/colmap/pull/2672
- 由 @ahojnnes 实现在 release/* 分支触发 CI https://github.com/colmap/colmap/pull/2673
- 由 @ahojnnes 统一 C++/Python 版本号方案 https://github.com/colmap/colmap/pull/2674
- 由 @B1ueber2y 添加带协方差的 3D 对齐成本函数 https://github.com/colmap/colmap/pull/2621
- 由 @sarlinpe 实现 Numpy 2 兼容性 https://github.com/colmap/colmap/pull/2682
- 由 @fulkast 修复 pycolmap CMake Python 开发环境配置问题 https://github.com/colmap/colmap/pull/2683
- 由 @TamirCohen 从文档中移除不存在的 model_aligner 标志 https://github.com/colmap/colmap/pull/2696
- 由 @mvieth 将 CMAKE_MODULE_PATH 重置为先前值 https://github.com/colmap/colmap/pull/2699
- 由 @ahojnnes 增强 nchoosek 防止溢出 https://github.com/colmap/colmap/pull/2706
- 由 @bo-rc 在查询操作前检查 image_id 是否存在 https://github.com/colmap/colmap/pull/2704
- 由 @sarlinpe 从 database.py:add_image 移除姿态先验 https://github.com/colmap/colmap/pull/2707
- 由 @flm8620 修复顺序匹配器重叠数应包含边界值的问题 https://github.com/colmap/colmap/pull/2701
- 由 @sweber1 修复被 clang-format 破坏的表格 https://github.com/colmap/colmap/pull/2710
- 由 @ahojnnes 以全精度写入 ini 选项,放宽束调整收敛条件 https://github.com/colmap/colmap/pull/2713
- 由 @ahojnnes 添加特征匹配配对库测试 https://github.com/colmap/colmap/pull/2711
- 由 @B1ueber2y 将 IncrementalMapperOptions 重命名为 IncrementalPipelineOptions https://github.com/colmap/colmap/pull/2708
- 由 @ahojnnes 添加 CUDA 稀疏 BA 求解器支持 https://github.com/colmap/colmap/pull/2717
- 由 @ahojnnes 将 HierarchicalMapperController 重命名为 HierarchicalPipeline https://github.com/colmap/colmap/pull/2718
- 由 @IshitaTakeshi 使 VisualIndex::Quantize 成为常量以提升可读性 https://github.com/colmap/colmap/pull/2723
- 由 @drkoller 修复新束调整代码中的 CUDA_ENABLED 宏 https://github.com/colmap/colmap/pull/2725
- 由 @sarlinpe 自动生成存根文件 https://github.com/colmap/colmap/pull/2721
- 由 @ahojnnes 添加基于 CUDA 的密集 BA 求解器 https://github.com/colmap/colmap/pull/2732
- 由 @ahojnnes 改进并简化特征匹配缓存机制 https://github.com/colmap/colmap/pull/2731
- 由 @B1ueber2y 修复日志宏支持中的 colmap 命名空间问题 https://github.com/colmap/colmap/pull/2733
- 由 @ahojnnes 通过移动添加回调函数 https://github.com/colmap/colmap/pull/2734
- 由 @ahojnnes 实现带配对生成器的传递匹配器及测试 https://github.com/colmap/colmap/pull/2735
- 由 @sarlinpe 为部分估计器选项提供合理默认值 https://github.com/colmap/colmap/pull/2745
- 由 @sarlinpe 修复 Delaunay 网格选项不匹配问题 https://github.com/colmap/colmap/pull/2748
- 由 @sarlinpe 编写 PyCOLMAP API 文档 https://github.com/colmap/colmap/pull/2749
- 由 @sarlinpe 改进 pycolmap 覆盖率和文档 https://github.com/colmap/colmap/pull/2752
- 由 @sarlinpe 对 pycolmap 进行后续修复 https://github.com/colmap/colmap/pull/2755
- 由 @sarlinpe 在 import_images 中报告错误 https://github.com/colmap/colmap/pull/2750
- 由 @ahojnnes 进一步简化特征匹配器代码 https://github.com/colmap/colmap/pull/2744
- 由 @sarlinpe 添加缺失的 ClearModifiedPoints3D 方法 https://github.com/colmap/colmap/pull/2761
- 由 @ahojnnes 为重建图像存储共享相机指针 https://github.com/colmap/colmap/pull/2762
- 由 @ahojnnes 避免 IncrementalTriangulator::Complete() 中不必要的队列拷贝 https://github.com/colmap/colmap/pull/2764
- 由 @ahojnnes 为 THROW_CHECK_NOTNULL 添加分支预测 https://github.com/colmap/colmap/pull/2765
- 由 @ahojnnes 在更多位置使用共享相机指针 https://github.com/colmap/colmap/pull/2763
- 由 @B1ueber2y 支持直接通过相机指针切换相机 https://github.com/colmap/colmap/pull/2767
- 由 @B1ueber2y 添加 MergeReconstructions 测试 https://github.com/colmap/colmap/pull/2766
- 由 @ahojnnes 修复大小端检测 https://github.com/colmap/colmap/pull/2768
- 由 @whuaegeanse 修复 CUDA 稀疏 BA 求解器选项 https://github.com/colmap/colmap/pull/2758
- 由 @ahojnnes 重命名 SupperMeasurer::Compare 提升可读性 https://github.com/colmap/colmap/pull/2774
- 由 @ahojnnes 改进安装文档 https://github.com/colmap/colmap/pull/2773
- 由 @TamirCohen 修复 align_reconstrution_to_locations 拼写错误为 align_reconstruction… https://github.com/colmap/colmap/pull/2776
- 由 @B1ueber2y 修复 Reconstruction.DeleteAllPoints2DAndPoints3D() 缺失相机指针问题 https://github.com/colmap/colmap/pull/2779
- 由 @ahojnnes 将剩余 proj_matrix 实例重命名为 cam_from_world https://github.com/colmap/colmap/pull/2780
- 由 @ahojnnes 相对姿态分解使用 Rigid3d https://github.com/colmap/colmap/pull/2781
- 由 @B1ueber2y 对 pycolmap point2d 和 point3d 文件名进行小规模重命名 https://github.com/colmap/colmap/pull/2784
- 由 @B1ueber2y 添加鱼眼相机像素坐标有效性检查并修复测试 https://github.com/colmap/colmap/pull/2790
- 由 @ahojnnes 在 PRNG 函数中使用分支预测 https://github.com/colmap/colmap/pull/2796
- 由 @nushakrishnan 实现 Aria 鱼眼相机模型 https://github.com/colmap/colmap/pull/2786
- 由 @B1ueber2y 升级至 C++ 17 https://github.com/colmap/colmap/pull/2801
- 由 @ferreram 实现基于姿态先验的增量式映射器 https://github.com/colmap/colmap/pull/2660
- 由 @theartful 向 pycolmap 公开 UpdatePoint3DErrors 方法 https://github.com/colmap/colmap/pull/2805
- 由 @sarlinpe 改用 Ruff Python 格式化工具 https://github.com/colmap/colmap/pull/2803
- 由 @sarlinpe 添加混合 Python-C++ PyCOLMAP 包 https://github.com/colmap/colmap/pull/2747
- 由 @sarlinpe 为 Python 启用 Ruff 检查器 https://github.com/colmap/colmap/pull/2806
- 由 @ahojnnes 在部分位置使用 C++17 结构化绑定 https://github.com/colmap/colmap/pull/2808
- 由 @ahojnnes 在相机文档中添加 RAD_TAN_THIN_PRISM_FISHEYE https://github.com/colmap/colmap/pull/2810
- 由 @B1ueber2y 将自定义成本函数改为函子形式 https://github.com/colmap/colmap/pull/2811
- 由 @ahojnnes 从 pypi 安装并使用新版 clang-format https://github.com/colmap/colmap/pull/2812
- 由 @sarlinpe 在 Reconstruction.image/camera/point3D 中返回引用 https://github.com/colmap/colmap/pull/2814
- 由 @ferreram 添加 PositionPriorErrorCostFunctor 测试 https://github.com/colmap/colmap/pull/2815
- 由 @ahojnnes 用标准库替代 boost/filesystem https://github.com/colmap/colmap/pull/2809
- 由 @ahojnnes 修复无 CUDA 时 BA 求解器类型选择问题 https://github.com/colmap/colmap/pull/2822
- 由 @sarlinpe 在无效访问 image/camera/point3D 时抛出更详细异常 https://github.com/colmap/colmap/pull/2825
- 由 @ahojnnes 使用 poselib 的最小求解器 https://github.com/colmap/colmap/pull/2288
- 由 @ahojnnes 在 poselib 中禁用 -march=native 标志 https://github.com/colmap/colmap/pull/2828
- 由 @sarlinpe 使
Image::cam_from_world_
成为可选 https://github.com/colmap/colmap/pull/2824 - 由 @sarlinpe 移除配置步骤中的警告 https://github.com/colmap/colmap/pull/2830
- 由 @ahojnnes 修复 EstimateAbsolutePose 中的坐标表示法 https://github.com/colmap/colmap/pull/2833
- 由 @ahojnnes 在底层三角测量函数中返回成功状态 https://github.com/colmap/colmap/pull/2834
- 由 @ahojnnes 为测试固定 mypy 版本 https://github.com/colmap/colmap/pull/2849
- 由 @ahojnnes 在 CMake 3.30+ 下抑制 FindBoost 的 CMP0167 警告 https://github.com/colmap/colmap/pull/2853
- 由 @ahojnnes 添加重建读写器测试和场景类 repr https://github.com/colmap/colmap/pull/2842
- 由 @ahojnnes 当束调整使用 GPU 时选择 CUDA 设备 https://github.com/colmap/colmap/pull/2846
- 由 @B1ueber2y 修复 Reconstruction 关于相机指针的拷贝行为 https://github.com/colmap/colmap/pull/2841
- 由 @sarlinpe 为 Python 数据类对象使用 C++ 字符串表示 https://github.com/colmap/colmap/pull/2855
- 由 @ahojnnes 对 pycolmap 绑定进行多项改进 https://github.com/colmap/colmap/pull/2854
- 由 @B1ueber2y 在 IterativeUndistortion 中使用解析雅可比矩阵并添加信任区域 https://github.com/colmap/colmap/pull/2857
- 由 @B1ueber2y 改进协方差估计的条件数 https://github.com/colmap/colmap/pull/2860
- 由 @ahojnnes 避免不必要的 RANSAC 内点掩码拷贝 https://github.com/colmap/colmap/pull/2863
- 由 @ahojnnes 对成本函子进行多项改进 https://github.com/colmap/colmap/pull/2867
- 由 @ahojnnes 将
*_mapper
文件重命名为*_pipeline
https://github.com/colmap/colmap/pull/2870 - 由 @sarlinpe 将 manylinux CI 更新至 GCC 10 https://github.com/colmap/colmap/pull/2873
- 由 @ahojnnes 修复因并发数据库访问导致的罕见匹配死锁 https://github.com/colmap/colmap/pull/2876
- 由 @ahojnnes 向自动重建器添加新选项和缺失选项 https://github.com/colmap/colmap/pull/2877
- 由 @ahojnnes 共享自动微分成本函数创建 https://github.com/colmap/colmap/pull/2878
- 由 @ahojnnes 启用模型与参考模型对齐功能 https://github.com/colmap/colmap/pull/2879
- 由 @ahojnnes 添加协方差加权成本函子 https://github.com/colmap/colmap/pull/2880
- 由 @ahojnnes 修复 MSVC 下的未使用变量警告 https://github.com/colmap/colmap/pull/2884
- 由 @ahojnnes 在 PR 构建中仅保留最新 Python 版本 https://github.com/colmap/colmap/pull/2881
- 由 @kielnino 修复 README.md 中的示例路径 [文档] https://github.com/colmap/colmap/pull/2886
- 由 @ahojnnes 更新 Github actions 版本 https://github.com/colmap/colmap/pull/2887
- 由 @kielnino 修复 GUI 菜单项拼写错误 [文档] https://github.com/colmap/colmap/pull/2885
- 由 @ahojnnes 修复极端质量设置下自动立体融合的输入类型 https://github.com/colmap/colmap/pull/2893
- 由 @HernandoR 使包含所有源码的目标成为可选 https://github.com/colmap/colmap/pull/2889
- 由 @ahojnnes 在查看器中优雅处理缺失图像姿态 https://github.com/colmap/colmap/pull/2894
- 由 @ahojnnes 更新至最新 vcpkg 版本 2024.10.21 https://github.com/colmap/colmap/pull/2908
- 由 @ahojnnes 修复 SIFT 特征提取中 CUDA 纹理引用到对象的转换 https://github.com/colmap/colmap/pull/2911
- 由 @ahojnnes 现代化束调整接口 https://github.com/colmap/colmap/pull/2896
- 由 @ahojnnes 添加缺失的重建对齐函数单元测试 https://github.com/colmap/colmap/pull/2913
- 由 @sarlinpe 在 LSD 禁用时不测试 EstimateManhattanWorldFrame https://github.com/colmap/colmap/pull/2920
- 由 @B1ueber2y 添加枚举到字符串支持的自定义宏 https://github.com/colmap/colmap/pull/2918
- 由 @sarlinpe 绑定 Sim3d 的估计 https://github.com/colmap/colmap/pull/2903
- 由 @ahojnnes 在自定义 gmock main 函数中初始化 glog https://github.com/colmap/colmap/pull/2916
- 由 @ahojnnes 更新 ccache 以加速 Windows CI 构建 https://github.com/colmap/colmap/pull/2922
- 由 @ahojnnes 修复 Windows ARM64 支持问题 https://github.com/colmap/colmap/pull/2921
- 由 @ahojnnes 将
__repr__
、__eq__
重载的几何实现移至 C++ 端 https://github.com/colmap/colmap/pull/2915 - 由 @ahojnnes 统一 pycolmap/estimators 接口并进行多项改进 https://github.com/colmap/colmap/pull/2923
- 由 @sarlinpe 在 LSD 禁用时排除 DetectLineSegments https://github.com/colmap/colmap/pull/2927
- 由 @Ediolot 支持将 16 位/通道 (png) 图像读取为灰度图 <https://github.com/colmap/
COLMAP 3.10 (2024年7月23日)
- 由@Tobias-Fischer添加缺失的
#include <memory>
以支持unique_ptr https://github.com/colmap/colmap/pull/2338 - 由@jot-jt支持Python脚本中的多字节字符解码 https://github.com/colmap/colmap/pull/2344
- 由@pablospe将Dockerfile拆分为构建和运行两个阶段 https://github.com/colmap/colmap/pull/2347
- 由@pablospe改进Dockerfile https://github.com/colmap/colmap/pull/2356
- 由@sarlinpe更新Windows CI中的VCPKG提交 https://github.com/colmap/colmap/pull/2365
- 由@sarlinpe简化重投影误差代价函数的创建 https://github.com/colmap/colmap/pull/2364
- 由@sarlinpe迁移pycolmap https://github.com/colmap/colmap/pull/2367
- 由@sarlinpe将pycolmap CI中的master重命名为main https://github.com/colmap/colmap/pull/2370
- 由@sarlinpe绑定SetPRNGSeed https://github.com/colmap/colmap/pull/2369
- 由@ahojnnes在colmap bitmap中封装pycolmap的freeimage使用 https://github.com/colmap/colmap/pull/2372
- 由@ahojnnes在git变更时重新生成版本信息 https://github.com/colmap/colmap/pull/2373
- 由@ahojnnes合并colmap/pycolmap的README,更新致谢等 https://github.com/colmap/colmap/pull/2374
- 由@sarlinpe修复Windows上pycolmap CI的崩溃问题 https://github.com/colmap/colmap/pull/2383
- 由@sarlinpe为位姿图优化添加代价函数 https://github.com/colmap/colmap/pull/2378
- 由@sarlinpe切换到异常检查-v2 https://github.com/colmap/colmap/pull/2376
- 由@sarlinpe清理pycolmap中的检查 https://github.com/colmap/colmap/pull/2388
- 由@sarlinpe添加RigReprojErrorConstantRigCostFunction https://github.com/colmap/colmap/pull/2377
- 由@sarlinpe为pycolmap添加代价函数 https://github.com/colmap/colmap/pull/2393
- 由@whuaegeanse修复警告C4722 https://github.com/colmap/colmap/pull/2391
- 由@sarlinpe将重建IO工具移动到新文件 https://github.com/colmap/colmap/pull/2399
- 由@sarlinpe在返回None前获取GIL https://github.com/colmap/colmap/pull/2400
- 由@B1ueber2y将控制器与线程解耦,并将新逻辑集成到IncrementalMapperController中 https://github.com/colmap/colmap/pull/2392
- 由@sarlinpe简化低级三角测量API https://github.com/colmap/colmap/pull/2402
- 由@sarlinpe仅在未初始化时在pycolmap中初始化glog https://github.com/colmap/colmap/pull/2405
- 由@B1ueber2y使所有控制器继承自BaseController而非Thread(特征提取和匹配除外) https://github.com/colmap/colmap/pull/2406
- 由@diffner更新数据库文档中models.h的路径 https://github.com/colmap/colmap/pull/2412
- 由@ahojnnes将Ubuntu CI管道从ADO迁移到Github https://github.com/colmap/colmap/pull/2411
- 由@sarlinpe为Python 3.12构建wheel https://github.com/colmap/colmap/pull/2416
- 由@ahojnnes将MacOS CI管道从ADO迁移到Github https://github.com/colmap/colmap/pull/2418
- 由@sarlinpe改进Database的绑定 https://github.com/colmap/colmap/pull/2413
- 由@ahojnnes将Windows CI管道从ADO迁移到Github https://github.com/colmap/colmap/pull/2419
- 由@sarlinpe减少增量建图期间的日志记录 https://github.com/colmap/colmap/pull/2420
- 由@ahojnnes将Docker CI从ADO迁移到Github,移除ADO管道 https://github.com/colmap/colmap/pull/2422
- 由@sarlinpe简化IncrementalMapperController https://github.com/colmap/colmap/pull/2421
- 由@sarlinpe修复glog 0.7.0的问题 https://github.com/colmap/colmap/pull/2428
- 由@whuaegeanse修复拼写错误 https://github.com/colmap/colmap/pull/2430
- 由@whuaegeanse修复RunMapper https://github.com/colmap/colmap/pull/2431
- 由@sarlinpe在IncrementalMapperController中进行三角测量 https://github.com/colmap/colmap/pull/2429
- 由@sarlinpe仅在发布时推送新的Docker镜像 https://github.com/colmap/colmap/pull/2436
- 由@lpanaf修复类型为"custom"的模型对齐器不更新重建的问题 https://github.com/colmap/colmap/pull/2433
- 由@ahojnnes定义vcpkg清单 https://github.com/colmap/colmap/pull/2426
- 由@sarlinpe修复pycolmap.rig_absolute_pose_estimation中关键字参数的顺序 https://github.com/colmap/colmap/pull/2440
- 由@sarlinpe减少pycolmap的构建时间 https://github.com/colmap/colmap/pull/2443
- 由@sarlinpe改进CorrespondenceGraph的绑定 https://github.com/colmap/colmap/pull/2476
- 由@sarlinpe绑定Reconstruction::{SetUp,ImagePairStats} https://github.com/colmap/colmap/pull/2477
- 由@B1ueber2y为增量建图的子步骤添加绑定及Python示例 https://github.com/colmap/colmap/pull/2478
- 由@sarlinpe调试基于VCPKG的CI构建崩溃问题 https://github.com/colmap/colmap/pull/2508
- 由@B1ueber2y升级到pybind11 v2.12,修复bind_map和reconstruction.points3D https://github.com/colmap/colmap/pull/2502
- 由@B1ueber2y对pycolmap自定义运行器的日志记录进行小修复 https://github.com/colmap/colmap/pull/2503
- 由@ahojnnes修复缺失的公共链接依赖,打破特征-场景的循环依赖 https://github.com/colmap/colmap/pull/2497
- 由@fseegraeber在去畸变期间避免重复的图像分配 https://github.com/colmap/colmap/pull/2520
- 由@B1ueber2y修复reconstruction.points3D https://github.com/colmap/colmap/pull/2523
- 由@GrayMask修复使用hierarchical_mapper时的’std::out_of_range’错误 https://github.com/colmap/colmap/pull/2526
- 由@sarlinpe修复std::vector的绑定 https://github.com/colmap/colmap/pull/2533
- 由@tmnku包含pybind eigen头文件 https://github.com/colmap/colmap/pull/2510
- 由@B1ueber2y修复多模型的pycolmap Python管道 https://github.com/colmap/colmap/pull/2531
- 由@tmnku使two view geometry可写 https://github.com/colmap/colmap/pull/2540
- 由@B1ueber2y为捆绑调整添加自定义Python接口 https://github.com/colmap/colmap/pull/2509
- 由@MaximSmolskiy修复拼写错误 https://github.com/colmap/colmap/pull/2553
- 由@sarlinpe隐式将迭代器转换为ListPoint2D https://github.com/colmap/colmap/pull/2558
- 由@ArneSchulzTUBS修复model_cropper未重置cropped_rec的image.num_points3D的问题 https://github.com/colmap/colmap/pull/2557
- 由@sarlinpe拆分对生成和匹配 https://github.com/colmap/colmap/pull/2573
- 由@sarlinpe添加ObservationManager https://github.com/colmap/colmap/pull/2575
- 由@ahojnnes记录创建的特征提取器/匹配器类型的日志信息 https://github.com/colmap/colmap/pull/2579
- 由@zap150使LSD的AGPL依赖变为可选 https://github.com/colmap/colmap/pull/2578
- 由@sarlinpe在构建pycolmap wheel时禁用LSD https://github.com/colmap/colmap/pull/2580
- 由@ahojnnes合成完整的两视图几何和原始匹配 https://github.com/colmap/colmap/pull/2595
- 由@B1ueber2y支持Rigid3d的伴随矩阵计算 https://github.com/colmap/colmap/pull/2598
- 由@B1ueber2y修复位姿图优化的代价函数 https://github.com/colmap/colmap/pull/2601
- 由@B1ueber2y修复使用pyceres的Python捆绑调整示例 https://github.com/colmap/colmap/pull/2606
- 由@ahojnnes实现更快的单应性估计器 https://github.com/colmap/colmap/pull/2603
- 由@ahojnnes添加查找实三次多项式根的函数 https://github.com/colmap/colmap/pull/2609
- 由@B1ueber2y与ceres文档中的SqrtInformation约定对齐 https://github.com/colmap/colmap/pull/2611
- 由@ahojnnes实现更快的7点基础矩阵估计器 https://github.com/colmap/colmap/pull/2612
- 由@ahojnnes实现更快的8点基础矩阵估计器 https://github.com/colmap/colmap/pull/2613
- 由@B1ueber2y通过Schur消元实现捆绑调整的协方差估计 https://github.com/colmap/colmap/pull/2610
- 由@BSVogler改进Mac OS支持 https://github.com/colmap/colmap/pull/2622
- 由@ahojnnes将cibuildwheel更新至2.19.2 https://github.com/colmap/colmap/pull/2632
- 由@ahojnnes实现更快的本质矩阵估计器 https://github.com/colmap/colmap/pull/2618
- 由@sarlinpe移除CamFromWorldPrior并创建LocationPrior https://github.com/colmap/colmap/pull/2620
- 由@ahojnnes添加禁用卸载目标的选项,恢复CI管道 https://github.com/colmap/colmap/pull/2634
- 由@B1ueber2y实现更快的对小块的协方差计算 https://github.com/colmap/colmap/pull/2633
- 由@morrishelle修复最优点算法 https://github.com/colmap/colmap/pull/2640
- 由@ahojnnes添加用于性能分析的shell脚本助手 https://github.com/colmap/colmap/pull/2635
- 由@ahojnnes将PosePrior::IsValid声明为const https://github.com/colmap/colmap/pull/2653
- 由@ahojnnes添加Windows CUDA的CI构建 https://github.com/colmap/colmap/pull/2651
- 由@ahojnnes从CI发布Windows二进制文件 https://github.com/colmap/colmap/pull/2663
COLMAP 3.9.1 (2024年1月8日)
- 版本3.9更新日志由@ahojnnes提交于https://github.com/colmap/colmap/pull/2325
- 在bitmap库中完全封装freeimage (#2332) 由@ahojnnes提交于https://github.com/colmap/colmap/pull/2334
COLMAP 3.9 (2024年1月6日)
- 由 @ahojnnes 对所有代码进行 clang 格式化并要求 clang-format-14 https://github.com/colmap/colmap/pull/1785
- 修复 vcpkg Windows 构建的编译问题 @ahojnnes https://github.com/colmap/colmap/pull/1791
- 将版本号升级至 3.9 @ahojnnes https://github.com/colmap/colmap/pull/1794
- 移除 MSVC 中不必要的 /arch:sse2 标志 @ahojnnes https://github.com/colmap/colmap/pull/1798
- 更新 faq.rst @CGCooke https://github.com/colmap/colmap/pull/1801
- 修复 OpenCV 鱼眼相机代码注释中的错误 @CGCooke https://github.com/colmap/colmap/pull/1802
- 将废弃的 cudaThreadSynchronize 替换为 cudaDeviceSynchronize @ahojnnes https://github.com/colmap/colmap/pull/1806
- 将废弃的 CUDA 纹理引用替换为纹理对象 @ahojnnes https://github.com/colmap/colmap/pull/1809
- 移除未使用的 SIFT GPU CUDA 纹理引用 @ahojnnes https://github.com/colmap/colmap/pull/1823
- 升级 SiftGPU 以使用 CUDA 纹理对象 @ahojnnes https://github.com/colmap/colmap/pull/1838
- 移除 PBA 作为捆绑调整后端以支持 CUDA 12+ @ahojnnes https://github.com/colmap/colmap/pull/1840
- 替换废弃的 CUDA 饱和函数调用 @ahojnnes https://github.com/colmap/colmap/pull/1841
- 在采样期间避免不必要的内存分配 @ahojnnes https://github.com/colmap/colmap/pull/1842
- 清理 Docker 文档和脚本 @ahojnnes https://github.com/colmap/colmap/pull/1852
- 在自动重建窗口中添加“每个子文件夹共享内参”复选框 @kenshi84 https://github.com/colmap/colmap/pull/1853
- 更新 vcpkg @ahojnnes https://github.com/colmap/colmap/pull/1925
- 记录导致 Mat::Read() 检查失败的文件名 @SomeAlphabetGuy https://github.com/colmap/colmap/pull/1923
- 在 ReadPly 中正确检查 Z_index @countywest https://github.com/colmap/colmap/pull/1896
- 在读写矩阵时不重复打开文件 @SomeAlphabetGuy https://github.com/colmap/colmap/pull/1926
- 更新 vcpkg 至最新提交 @ahojnnes https://github.com/colmap/colmap/pull/1948
- 移除不必要的自定义 Eigen 对齐分配器宏 @ahojnnes https://github.com/colmap/colmap/pull/1947
- 为内部源文件/包含添加 colmap 前缀 @ahojnnes https://github.com/colmap/colmap/pull/1949
- 简化 clang-format 配置并排序包含 @ahojnnes https://github.com/colmap/colmap/pull/1950
- 处理 median 函数可能的溢出 @ahojnnes https://github.com/colmap/colmap/pull/1951
- 在 Ubuntu 22.04 下运行 ASan 流水线 @ahojnnes https://github.com/colmap/colmap/pull/1952
- 修复 Ceres 版本测试 @drkoller https://github.com/colmap/colmap/pull/1954
- 修复 Qt 字体度量宽度的废弃警告 @ahojnnes https://github.com/colmap/colmap/pull/1958
- 设置 clang-tidy 并启用性能警告 @ahojnnes https://github.com/colmap/colmap/pull/1959
- Windows CI 的 VCPKG 二进制缓存 @ahojnnes https://github.com/colmap/colmap/pull/1957
- VS 开发脚本的美化 @ahojnnes https://github.com/colmap/colmap/pull/1965
- 启用 clang-tidy 并发检查 @ahojnnes https://github.com/colmap/colmap/pull/1967
- [Bug] 修复 FindLocalBundle 中查找共享点3D的问题 @wesleyliwei https://github.com/colmap/colmap/pull/1963
- 在 CI 中启用编译器缓存 @ahojnnes https://github.com/colmap/colmap/pull/1972
- 为不同质量级别设置特征数量 @ahojnnes https://github.com/colmap/colmap/pull/1975
- 使用内联注释指定参数名称 @ahojnnes https://github.com/colmap/colmap/pull/1976
- 修复 Windows CCache @ahojnnes https://github.com/colmap/colmap/pull/1977
- 在 CI 流水线中使用 ETH3D 数据集添加端到端测试 @ahojnnes https://github.com/colmap/colmap/pull/1397
- [feature] 为模型分析器打印详细信 @wesleyliwei https://github.com/colmap/colmap/pull/1978
- 添加缺失的包含以支持 gcc13 编译 @EstebanDugueperoux2 https://github.com/colmap/colmap/pull/1984
- 在 RigBundleAdjuster 中加速快照构造 @wesleyliwei https://github.com/colmap/colmap/pull/1988
- 更新过时的 Docker CUDA 镜像标签 @ahojnnes https://github.com/colmap/colmap/pull/1992
- 在 CI 端到端测试中添加 boulders ETH3D 数据集 @ahojnnes https://github.com/colmap/colmap/pull/1991
- 更新文档中的可执行路径 @ahojnnes https://github.com/colmap/colmap/pull/1993
- 在 ExtractTopScaleFeatures 中避免不必要的复制 @ahojnnes https://github.com/colmap/colmap/pull/1994
- 将相关代码移至新的图像库文件夹 @ahojnnes https://github.com/colmap/colmap/pull/1995
- 将相关代码移至新的相机文件夹 @ahojnnes https://github.com/colmap/colmap/pull/1996
- 为 Sampler 添加虚析构函数 @SomeAlphabetGuy https://github.com/colmap/colmap/pull/2000
- 添加更多 clang-tidy 检查 @ahojnnes https://github.com/colmap/colmap/pull/2001
- 将相关代码移至新的几何模块 @ahojnnes https://github.com/colmap/colmap/pull/2006
- 使用 #pragma once 作为包含保护 @ahojnnes https://github.com/colmap/colmap/pull/2007
- 添加 bugprone-* clang-tidy 检查 @ahojnnes https://github.com/colmap/colmap/pull/2010
- 在声明中避免 const 参数 @ahojnnes https://github.com/colmap/colmap/pull/2011
- 设置并要求 C++14 @ahojnnes https://github.com/colmap/colmap/pull/2012
- 清理现在属于 eigen/stdlib 的数学函数 @ahojnnes https://github.com/colmap/colmap/pull/2013
- 添加 clang-analyzer 检查 @ahojnnes https://github.com/colmap/colmap/pull/2014
- 替换 CMake 提供的 find_package 脚本和现代 CMake 目标 @ahojnnes https://github.com/colmap/colmap/pull/2016
- 从 Boost 单元测试切换到 Gtest @ahojnnes https://github.com/colmap/colmap/pull/2017
- 修复流水线缓存中的 ccache 恢复键 @ahojnnes https://github.com/colmap/colmap/pull/2018
- 添加缺失的 cacheHitVar 以修复 ccache @ahojnnes https://github.com/colmap/colmap/pull/2020
- 添加缺失的 Boost::graph 导入 @sarlinpe https://github.com/colmap/colmap/pull/2021
- 压缩/扁平化的对应图以加速三角测量/减少内存 @ahojnnes https://github.com/colmap/colmap/pull/2019
- 修复窗口 ccache 键 @ahojnnes https://github.com/colmap/colmap/pull/2024
- 对 SFM 对象一致使用 shared_ptr @ahojnnes https://github.com/colmap/colmap/pull/2023
- 移除对 Qt 版本的检查 @sarlinpe https://github.com/colmap/colmap/pull/2022
- 为端到端增量映射器测试添加合成数据 @ahojnnes https://github.com/colmap/colmap/pull/2025
- 新的数学模块 @ahojnnes https://github.com/colmap/colmap/pull/2028
- 简化相似变换并添加更多测试 @ahojnnes https://github.com/colmap/colmap/pull/2030
- 将重建对齐函数提取到新文件 @ahojnnes https://github.com/colmap/colmap/pull/2032
- 添加端到端分层映射器测试 @ahojnnes https://github.com/colmap/colmap/pull/2033
- 将 SimilarityTransform3 重命名为 Sim3d @ahojnnes https://github.com/colmap/colmap/pull/2034
- 添加 Rigid3d 变换类 @ahojnnes https://github.com/colmap/colmap/pull/2035
- 整合并简化 Rigid3d 和 Sim3d @ahojnnes https://github.com/colmap/colmap/pull/2037
- 对 rigid3d/sim3d 使用的一些小改进/清理 @ahojnnes https://github.com/colmap/colmap/pull/2041
- CamFromWorld 替换 qvec/tvec @ahojnnes https://github.com/colmap/colmap/pull/2039
- 重试下载 ETH3D 数据集 @ahojnnes https://github.com/colmap/colmap/pull/2043
- WorldToImage 变为 CamToImg @ahojnnes https://github.com/colmap/colmap/pull/2044
- 相机模型操作相机光线 @ahojnnes https://github.com/colmap/colmap/pull/2045
- 忽略 .vs 目录 @whuaegeanse https://github.com/colmap/colmap/pull/2046
- 使用 Rigid3d 的引用以减少内存消耗 @whuaegeanse https://github.com/colmap/colmap/pull/2047
- 内联点到图像投影 @ahojnnes https://github.com/colmap/colmap/pull/2050
- Point2D 变为更简单的纯数据结构 @ahojnnes https://github.com/colmap/colmap/pull/2051
- 使用 Eigen 数学进行估计器工具 @ahojnnes https://github.com/colmap/colmap/pull/2052
- 将成本函数移至几何模块并重命名 @ahojnnes https://github.com/colmap/colmap/pull/2053
- 捆绑调整器是一个估计器 @ahojnnes https://github.com/colmap/colmap/pull/2054
- 剩余的基础目标移至新的场景模块 @ahojnnes https://github.com/colmap/colmap/pull/2055
- 投票和验证改进/加速 @ahojnnes https://github.com/colmap/colmap/pull/2056
- 在 .cc 文件中生成版本信息以减少重新编译次数 @ahojnnes https://github.com/colmap/colmap/pull/2057
- 选项管理器移至控制器以解耦循环依赖 @ahojnnes https://github.com/colmap/colmap/pull/2058
- 细粒度的 CMake 模块和构建目标 @ahojnnes https://github.com/colmap/colmap/pull/2059
- 修复 Docker 构建 @ahojnnes https://github.com/colmap/colmap/pull/2069
- 移除关于重复宏 NOMINMAX 的警告 @whuaegeanse https://github.com/colmap/colmap/pull/2067
- lib 文件夹变为 thirdparty 文件夹 @ahojnnes https://github.com/colmap/colmap/pull/2068
- 移除图像对转换中不必要的检查 @ahojnnes https://github.com/colmap/colmap/pull/2074
- 用 courtyard 数据集替换不稳定的 ETH3D terrace @ahojnnes https://github.com/colmap/colmap/pull/2075
- 为更多映射器测试合成链式匹配图 @ahojnnes https://github.com/colmap/colmap/pull/2076
- 引入抽象特征提取器 @ahojnnes https://github.com/colmap/colmap/pull/2077
- 在特征转换工具中避免不必要的数据复制 @ahojnnes https://github.com/colmap/colmap/pull/2078
- 抽象特征匹配器 @ahojnnes https://github.com/colmap/colmap/pull/2082
- 封装特征匹配控制器/工作器实现 @ahojnnes https://github.com/colmap/colmap/pull/2085
- 对 util/feature 类型的一些美化 @ahojnnes https://github.com/colmap/colmap/pull/2084
- 当包含 cmath 时使用 std:: @whuaegeanse https://github.com/colmap/colmap/pull/2081
- 封装特征提取控制器/工作器实现 @ahojnnes https://github.com/colmap/colmap/pull/2086
- 重新启用 VS2022 CI 流水线 @ahojnnes https://github.com/colmap/colmap/pull/1689
- CenterAndNormalizeImagePoints 的一致变换约定 @ahojnnes https://github.com/colmap/colmap/pull/2092
- 停用 Mac 11 CI 构建 @ahojnnes https://github.com/colmap/colmap/pull/2094
- 添加 ReprojErrorConstantPoint3DCostFunction 以加速 RefineAbsolutePose 函数 @whuaegeanse https://github.com/colmap/colmap/pull/2089
- 使用部分主元 LU 对相机模型进行数值微分 @ahojnnes https://github.com/colmap/colmap/pull/2100
- cmake: 仅在 TESTS_ENABLED=ON 时将 testing.cc 添加到 colmap_util @NeroBurner https://github.com/colmap/colmap/pull/2102
- 将 CUDA_STANDARD 设置为 14 @ahojnnes https://github.com/colmap/colmap/pull/2108
- 如果设置为固定,则在映射器处理后转换回现有图像位置 @ferreram https://github.com/colmap/colmap/pull/2095
- 使用新的分支策略更新文档 @ahojnnes https://github.com/colmap/colmap/pull/2110
- 为 vcpkg 更新 CMake 查找依赖项 @ahojnnes https://github.com/colmap/colmap/pull/2116
- 将 SIFT 匹配与双视图几何选项解耦 @ahojnnes https://github.com/colmap/colmap/pull/2118
- 修复 Docker 构建 @vnmsklnk https://github.com/colmap/colmap/pull/2122
- 在主分支上触发构建流水线 @ahojnnes https://github.com/colmap/colmap/pull/2123
- 使用新的分支策略更新 Linux 安装文档 @joshuaoreilly https://github.com/colmap/colmap/pull/2126
- 修复相机模型文档中的链接 @CFretter https://github.com/colmap/colmap/pull/2152
- [Bugfix] 修复 GUI_ENABLED=OFF 并在无 GUI 和无 CUDA 时跳过 SiftGPU @sarlinpe https://github.com/colmap/colmap/pull/2151
- [Bugfix] 正确处理 CGAL_ENABLED @sarlinpe https://github.com/colmap/colmap/pull/2149
- 在 point_triangulator 中优化内参 @tsattler https://github.com/colmap/colmap/pull/2144
- 修复处理 COLMAP_GPU_ENABLED 的错误 @sarlinpe https://github.com/colmap/colmap/pull/2163
- 将 exe 公开为 libs @sarlinpe <https://github.com/colmap/colmap/pull/2165
COLMAP 3.8 (2023年1月31日)
- 更新地理配准文档 @ferreram https://github.com/colmap/colmap/pull/1410
- 添加纯平面场景重建的用户指定选项 @ferreram https://github.com/colmap/colmap/pull/1408
- 仅当数据库中有元素被删除时才执行sqlite vacuum命令 @ferreram https://github.com/colmap/colmap/pull/1414
- 将Graclus依赖替换为Metis @ahojnnes https://github.com/colmap/colmap/pull/1422
- 更新构建脚本中的ceres下载URL @whuaegeanse https://github.com/colmap/colmap/pull/1430
- 修复Windows下使用build.py构建colmap时的类型错误 @whuaegeanse https://github.com/colmap/colmap/pull/1440
- 修复全局/局部BA统计计算中的错误 @whuaegeanse https://github.com/colmap/colmap/pull/1449
- 添加RefineGeneralizedAbsolutePose和协方差估计功能 @Skydes https://github.com/colmap/colmap/pull/1464
- 更新Docker镜像定义 @ahojnnes https://github.com/colmap/colmap/pull/1478
- 将弃用的ceres参数化升级为流形 @ahojnnes https://github.com/colmap/colmap/pull/1477
- 在自动重建中使用掩码进行立体融合 @ibrarmalik https://github.com/colmap/colmap/pull/1488
- 修复外部接口设置随机种子失败的问题 @WZG3661 https://github.com/colmap/colmap/pull/1498
- 为最新Eigen版本替换弃用的nonZeros()调用 @nackjaylor https://github.com/colmap/colmap/pull/1494
- 修复ceres-solver文件夹名称 @f-fl0 https://github.com/colmap/colmap/pull/1501
- 改进XYZ到ELL转换的收敛标准 @ahojnnes https://github.com/colmap/colmap/pull/1505
- 修复Bitmap中SetPtr函数的错误 @whuaegeanse https://github.com/colmap/colmap/pull/1525
- 避免调用拷贝构造函数/赋值操作 @whuaegeanse https://github.com/colmap/colmap/pull/1524
- 避免调用FeatureKeypoints和FeatureDescriptors的拷贝构造函数 @whuaegeanse https://github.com/colmap/colmap/pull/1540
- 静态链接时初始化freeimage @ahojnnes https://github.com/colmap/colmap/pull/1549
- 避免雅可比矩阵秩不足时硬崩溃 @mihaidusmanu https://github.com/colmap/colmap/pull/1557
- visualize_model.py: 添加FULL_OPENCV模型 @soeroesg https://github.com/colmap/colmap/pull/1552
- 更新vcpkg版本以修复CI流水线 @ahojnnes https://github.com/colmap/colmap/pull/1568
- 在CI中将弃用的Mac OS 10.15替换为Mac OS 12构建 @ahojnnes https://github.com/colmap/colmap/pull/1569
- 修复实际执行的图像读取器选项与保存的project.ini文件不一致的问题 @XuChengHUST https://github.com/colmap/colmap/pull/1564
- 检出预期版本的ceres求解器 @scott-vsi https://github.com/colmap/colmap/pull/1576
- 使用默认的qt5 brew安装目录 #1573 @catapulta https://github.com/colmap/colmap/pull/1574
- 修复嵌套图像文件夹的图像去畸变问题 @ahojnnes https://github.com/colmap/colmap/pull/1606
- 修复源文件权限 @ahojnnes https://github.com/colmap/colmap/pull/1607
- 修复colmap.bat中的参数收集问题 @tdegraaff https://github.com/colmap/colmap/pull/1121
- 如果启用OpenMP则将其添加到COLMAP_EXTERNAL_LIBRARIES @logchan https://github.com/colmap/colmap/pull/1632
- 修复RunModelSplitter中输出瓦片重建与输入重建相同的问题(#1513) @Serenitysmk https://github.com/colmap/colmap/pull/1531
- 添加libmetis-dev以解决METIS_INCLUDE_DIRS问题 @FavorMylikes https://github.com/colmap/colmap/pull/1672
- 更新install.rst文档 @tomer-grin https://github.com/colmap/colmap/pull/1671
- 更新freeimage链接 @Yulv-git https://github.com/colmap/colmap/pull/1675
- 修复小拼写错误 @skal65535 https://github.com/colmap/colmap/pull/1668
- 使用新的glew链接更新build.py @aghand0ur https://github.com/colmap/colmap/pull/1658
- 在融合选项GUI中添加use_cache选项 @hrflr https://github.com/colmap/colmap/pull/1655
- 为Ubuntu 22.04添加CI流水线 @ahojnnes https://github.com/colmap/colmap/pull/1688
- 避免不必要的数据拷贝 @ahojnnes https://github.com/colmap/colmap/pull/1691
- 减少对应图搜索中的内存分配 @ahojnnes https://github.com/colmap/colmap/pull/1692
- 当可用时使用FindCUDAToolkit @hanseuljun https://github.com/colmap/colmap/pull/1693
- 修复由于不一致的去畸变导致的崩溃 @SomeAlphabetGuy https://github.com/colmap/colmap/pull/1698
- 添加CUDA Ubuntu 22.04 CI构建 @ahojnnes https://github.com/colmap/colmap/pull/1705
- 删除冗余的libmetis-dev安装 @thomas-graphopti https://github.com/colmap/colmap/pull/1721
- 修复macOS上图像掩码加载失败的问题 @buesma https://github.com/colmap/colmap/pull/1639
- 使用最新提示和已知问题更新安装说明 @ahojnnes https://github.com/colmap/colmap/pull/1736
- 现代化智能指针初始化,修复分配/释放不匹配问题 @ahojnnes https://github.com/colmap/colmap/pull/1737
- 修复cli.rst中的拼写错误 @ojhernandez https://github.com/colmap/colmap/pull/1747
- 修复SIFT的CPU/GPU实现之间图像大小调整不一致的问题 @Yzhbuaa https://github.com/colmap/colmap/pull/1642
- 减少SIFT测试特征数量以使测试在WSL下运行 @ahojnnes https://github.com/colmap/colmap/pull/1748
- 为文档版本添加dev标签 @ahojnnes https://github.com/colmap/colmap/pull/1749
- 将版权更新至2023年 @ahojnnes https://github.com/colmap/colmap/pull/1750
- 修复first_octave为正时的最大图像尺寸问题 @ahojnnes https://github.com/colmap/colmap/pull/1751
- 修复SIFT GPU匹配创建问题 @ahojnnes https://github.com/colmap/colmap/pull/1757
- 为OpenGL修复SIFT测试 @ahojnnes https://github.com/colmap/colmap/pull/1762
- 抑制ptxas的CUDA堆栈大小警告 @ahojnnes https://github.com/colmap/colmap/pull/1770
- 简化CUDA CMake配置 @ahojnnes https://github.com/colmap/colmap/pull/1776
- 修复CUDA编译问题 @ahojnnes https://github.com/colmap/colmap/pull/1777
- 改进dockerfile和构建流水线 @ahojnnes https://github.com/colmap/colmap/pull/1778
- 明确要求定义CMAKE_CUDA_ARCHITECTURES @ahojnnes https://github.com/colmap/colmap/pull/1781
- 依赖系统安装的FLANN @ahojnnes https://github.com/colmap/colmap/pull/1782
- 添加在数据库中存储两个相机之间相对姿态的选项 @yanxke https://github.com/colmap/colmap/pull/1774
- 依赖系统安装的SQLite3 @ahojnnes https://github.com/colmap/colmap/pull/1783
COLMAP 3.7 (2022年1月26日)
- 允许通过命令行保存融合点云为colmap格式,由@boitumeloruf提交于https://github.com/colmap/colmap/pull/799
- 修复image.h中的拼写错误,由@Pascal-So提交于https://github.com/colmap/colmap/pull/936
- 修复EPnP估计器问题,由@vlarsson提交于https://github.com/colmap/colmap/pull/943
- 使用Python在Open3D中可视化模型,由@ahojnnes提交于https://github.com/colmap/colmap/pull/948
- 更新教程文档,由@ignacio-rocco提交于https://github.com/colmap/colmap/pull/953
- 修复8点算法内部约束问题,由@mihaidusmanu提交于https://github.com/colmap/colmap/pull/982
- 新增Python脚本用于写入深度/法线数组,由@SBCV提交于https://github.com/colmap/colmap/pull/957
- BuildImageModel:使用std::vector替代编号参数,由@Pascal-So提交于https://github.com/colmap/colmap/pull/949
- 修复SIFT特征匹配的bug,由@whuaegeanse提交于https://github.com/colmap/colmap/pull/985
- 新增修改融合结果的脚本,由@SBCV提交于https://github.com/colmap/colmap/pull/984
- 修复相机模型查询问题,由@Pascal-So提交于https://github.com/colmap/colmap/pull/997
- 修复visualize_model.py中的小bug,由@sniklaus提交于https://github.com/colmap/colmap/pull/1007
- 更新.travis.yml配置,由@srinivas32提交于https://github.com/colmap/colmap/pull/989
- 确保DecomposeHomographyMatrix()始终返回旋转矩阵,由@daithimaco提交于https://github.com/colmap/colmap/pull/1040
- 移除已弃用的qt foreach语法,由@UncleGene提交于https://github.com/colmap/colmap/pull/1039
- 修复AMD/Windows GUI可视化bug,由@drkoller提交于https://github.com/colmap/colmap/pull/1079
- 在启用CUDA编译时包含colmap_cuda到COLMAP_LIBRARIES,由@ClementPinard提交于https://github.com/colmap/colmap/pull/1084
- 修复ceres缺少sparsesuite时的运行时崩溃,由@anmatako提交于https://github.com/colmap/colmap/pull/1115
- 在two_view_geometry表中存储相对位姿,由@Ahmed-Salama提交于https://github.com/colmap/colmap/pull/1103
- 从整个集合而非仅引用子集中搜索patch_match的源图像,由@DaniilSNikulin提交于https://github.com/colmap/colmap/pull/1038
- 用Azure Pipelines替代Travis CI进行Linux/Mac构建,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1119
- 允许ReadPly处理双精度文件,由@anmatako提交于https://github.com/colmap/colmap/pull/1131
- 更新GPSTransform计算以提高精度,由@anmatako提交于https://github.com/colmap/colmap/pull/1132
- 在SimilarityTransform3::Estimate中添加比例模板标志,由@anmatako提交于https://github.com/colmap/colmap/pull/1133
- 添加CopyFile工具函数,支持复制或创建硬/软链接,由@anmatako提交于https://github.com/colmap/colmap/pull/1134
- 在IncrementalMapper中暴露BA选项,由@anmatako提交于https://github.com/colmap/colmap/pull/1139
- 允许为mvs::Model配置路径,由@anmatako提交于https://github.com/colmap/colmap/pull/1141
- 修改ReconstructionManager优先写入较大重建,由@anmatako提交于https://github.com/colmap/colmap/pull/1137
- 为Windows构建设置Azure Pipelines,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1150
- 在rig配置中添加固定外参,由@anmatako提交于https://github.com/colmap/colmap/pull/1144
- 允许为patch-match使用自定义配置和缺失依赖,由@anmatako提交于https://github.com/colmap/colmap/pull/1142
- 更新print语句以兼容Python 3,由@UncleGene提交于https://github.com/colmap/colmap/pull/1126
- 允许使用新的database_cleaner命令清理SQLite表,由@anmatako提交于https://github.com/colmap/colmap/pull/1136
- 扩展SceneClustering以支持非层次化(扁平)聚类,由@anmatako提交于https://github.com/colmap/colmap/pull/1140
- 在model_converter中支持更多格式,由@anmatako提交于https://github.com/colmap/colmap/pull/1147
- 修复Mac 10.15因Qt5路径变更导致的构建问题,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1157
- 修复ReadCameraRigConfig读取外参时的bug,由@anmatako提交于https://github.com/colmap/colmap/pull/1158
- 添加比较两个稀疏模型位姿的工具,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1159
- 将可执行主函数模块化到独立源文件,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1160
- 修复范围循环中的不必要拷贝,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1162
- 添加脚本以clang-format格式化所有源代码,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1163
- 恢复model_converter的新选项和格式,由@anmatako提交于https://github.com/colmap/colmap/pull/1164
- ImageReder新增选项及修复GPS先验的bug,由@anmatako提交于https://github.com/colmap/colmap/pull/1146
- 并行化立体融合;需要预加载整个工作区,由@anmatako提交于https://github.com/colmap/colmap/pull/1148
- 重构Reconstruction类并新增功能,由@anmatako提交于https://github.com/colmap/colmap/pull/1169
- 在image_undistorter中添加新功能,由@anmatako提交于https://github.com/colmap/colmap/pull/1168
- 新增CMake选项以禁用GUI,由@anmatako提交于https://github.com/colmap/colmap/pull/1165
- 修复线程结束时未释放PRNG内存导致的内存泄漏,由@whuaegeanse提交于https://github.com/colmap/colmap/pull/1170
- 修复融合段错误bug,由@anmatako提交于https://github.com/colmap/colmap/pull/1176
- 更新SiftGPU使用floorf处理浮点数,由@anmatako提交于https://github.com/colmap/colmap/pull/1182
- 修复extraction.cc中的拼写错误,由@iuk提交于https://github.com/colmap/colmap/pull/1191
- 改进NVM、Cam、Recon3D和Bundler导出器,由@drkoller提交于https://github.com/colmap/colmap/pull/1187
- 更新model_aligner功能,由@anmatako提交于https://github.com/colmap/colmap/pull/1177
- 新增model_cropper和model_splitter命令,由@anmatako提交于https://github.com/colmap/colmap/pull/1179
- 使用point2D_t类型替代image_t,由@iuk提交于https://github.com/colmap/colmap/pull/1199
- 修复Cam格式导出器中的径向畸变问题,由@drkoller提交于https://github.com/colmap/colmap/pull/1196
- 新增model_transformer命令,由@anmatako提交于https://github.com/colmap/colmap/pull/1178
- 修复使用urllib从gitlab下载eigen时的错误,由@whuaegeanse提交于https://github.com/colmap/colmap/pull/1194
- 修复Python模型脚本中的多行字符串问题,由@mihaidusmanu提交于https://github.com/colmap/colmap/pull/1217
- 为delaunay_mesher的CLI输入选项添加visibility_sigma,由@Matstah提交于https://github.com/colmap/colmap/pull/1236
- 实现model_aligner的向后兼容,由@tsattler提交于https://github.com/colmap/colmap/pull/1240
- [更新去畸变]更新转储命令,由@hiakru提交于https://github.com/colmap/colmap/pull/1276
- 在广义绝对求解器中计算重投影误差,由@Skydes提交于https://github.com/colmap/colmap/pull/1257
- 修改scripts/python/flickr_downloader.py以创建正确扩展名的文件,由@snavely提交于https://github.com/colmap/colmap/pull/1275
- 修订Dockerfile和readme,由@MasahiroOgawa提交于https://github.com/colmap/colmap/pull/1281
- 更新至最新vcpkg版本,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1319
- 修复GCC报告的编译器警告,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1317
- 基于EXIF方向自动旋转JPEG图像,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1318
- 升级vcpkg以修复CI构建问题,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1331
- 为feature_extractor添加描述符归一化参数,由@mihaidusmanu提交于https://github.com/colmap/colmap/pull/1332
- 修复StringAppendV函数中的内存泄漏,由@whuaegeanse提交于https://github.com/colmap/colmap/pull/1337
- 为cudaGetDeviceCount添加CUDA_SAFE_CALL,由@chpatrick提交于https://github.com/colmap/colmap/pull/1334
- 在未启用CUDA/GUI时添加缺失的包含,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1329
- 修复GPSTransform中的错误WGS84模型和测试用例,由@Freeverc提交于https://github.com/colmap/colmap/pull/1333
- 修复sprt.cc中的bug:未设置num_inliers,由@rmbrualla提交于https://github.com/colmap/colmap/pull/1360
- 防止除零的极端情况,由@rmbrualla提交于https://github.com/colmap/colmap/pull/1361
- 添加缺失的头文件,由@rmbrualla提交于https://github.com/colmap/colmap/pull/1362
- 仅在启用GUI时在COLMAPConfig中要求Qt,由@Skydes提交于https://github.com/colmap/colmap/pull/1365
- 在文本存储过程中保持精度,由@whuaegeanse提交于https://github.com/colmap/colmap/pull/1363
- 暴露exe内部接口,由@Skydes提交于https://github.com/colmap/colmap/pull/1366
- 修复EstimateUncalibrated函数中的内点匹配提取问题,由@ferreram提交于https://github.com/colmap/colmap/pull/1369
- 修复暴露exe内部接口的问题,由@Skydes提交于https://github.com/colmap/colmap/pull/1368
- 在ADO流水线中移除已弃用的Mac OSX 10.14镜像,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1383
- 为Mac OSX 11添加ADO流水线任务,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1384
- 修复最新编译器/库的警告,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1382
- 修复clang编译器警告,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1387
- 添加Address Sanitizer选项并修复报告的问题,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1390
- 清理Address Sanitizer相关代码,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1391
- 为Visual Studio 2022添加ADO流水线,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1392
- 添加ccache选项,由@ahojnnes提交于https://github.com/colmap/colmap/pull/1395
- 更新ModelAligner以处理GPS和自定义坐标等,由@ferreram提交于https://github.com/colmap/colmap/pull/1371
COLMAP 3.6 (2020年7月24日)
- 提升增量式重建过程的鲁棒性和速度
- 新增
image_deleter
命令,可从稀疏模型中移除图像 - 新增
image_filter
命令,可从稀疏模型中过滤不良配准结果 - 新增
point_filtering
命令,用于过滤稀疏模型点云 - 新增
database_merger
命令合并两个数据库,便于跨机器并行匹配 - 新增
image_undistorter_standalone
支持无需预存完整稀疏模型的图像去畸变 - 改进鱼眼相机和FOV相机模型的去畸变效果
- 支持在特征提取阶段对输入图像进行掩膜处理
- 增强GUI对高分辨率显示器的HiDPI支持
- 通过CLI启动GUI时可导入稀疏模型
- 采用近似最近邻搜索加速基于CPU的匹配
- 支持固定外参的捆绑调整
- 支持继续重建时固定现有图像
- 查看器中可自定义相机模型颜色
- CUDA版本支持最新GPU架构
- 支持通过Python脚本写入稀疏模型
- 提供Docker构建和运行COLMAP的脚本
- 大量代码和文档的改进与错误修复
COLMAP 3.5 (2018年8月22日)
- COLMAP 现已改用 BSD 许可证发布,不再使用 GPL 许可证
- COLMAP 现可作为库安装,其他 C/C++ 代码可包含其头文件并链接对应库
- 新增分层映射器,支持并行重建或大规模场景处理
- 新增稀疏和稠密 Delaunay 网格化算法,通过对重建的稀疏或稠密点云进行 Delaunay 三角剖分,并应用图割算法来重建水密表面
- 改进合并不同模型时的鲁棒性
- 提供改进版预训练词汇树供下载
- 在 Linux 桌面系统中添加 COLMAP 软件条目
- 新增支持在 ARM 平台编译 COLMAP
- 添加示例 Python 脚本用于读写 COLMAP 数据库
- 在图像去畸变中增加感兴趣区域(ROI)裁剪功能
- 修复图像检索中空间验证的多项导入错误
- 扩展持续集成覆盖更多编译场景
- 修复大量代码和文档问题并进行多项改进
COLMAP 3.4 (2018/01/29)
- 统一命令行界面:原可执行文件的功能已整合至
src/exe/colmap.cc
主程序。现在可通过命令colmap gui
启动图形界面,其他功能则通过colmap [command]
调用。例如特征提取器现可通过colmap feature_extractor [args]
运行,所有命令行参数保持原有格式。这一改进显著缩短了项目编译时间并减少了程序磁盘占用。新界面的详细说明见 https://colmap.github.io/cli.html - 采用更大补丁尺寸生成更完整的深度图与法线图
- 通过以下优化加速密集立体匹配计算:在块匹配中跳过行列采样、改进块匹配的随机采样算法、加速双边归一化互相关计算
- 图形界面增强对高DPI屏幕的支持
- Windows平台模型查看器升级(现需Qt 5.4运行环境)
- 支持将计算的双视图几何数据存入数据库
- 新增通过图形界面保存图像功能(包括关键点/匹配可视化图、深度图与法线图)
- 支持无需稀疏捆绑文件的PMVS格式
- 更快速的协变特征检测
- 大量错误修复与性能改进
COLMAP 3.3 (2017年11月21日)
- 新增DSP(域大小池化)SIFT实现。根据Schoenberger等人在CVPR 2017发表的论文《Comparative Evaluation of Hand-Crafted and Learned Local Features》所示,DSP-SIFT在多数情况下性能优于标准SIFT算法
- 优化了小规模模型的密集重建参数
- 通过多项代码优化显著缩短了编译时间
- 新增自动重建过程中指定相机模型的选项
- 基于图像直立假设新增模型方向对齐功能
- 提升了广义绝对位姿求解器的数值稳定性
- 支持在PMVS密集重建格式中指定图像范围
- 自动构建脚本现兼容更早版本的Python
- 修复OpenCV鱼眼相机模型以完全匹配OpenCV规范
COLMAP 3.2 (2017年9月2日发布)
- 全自动跨平台构建脚本(支持Windows、Mac、Linux系统)
- 新增多GPU特征提取功能(需配备多个CUDA设备)
- 词汇树实现支持可配置的维度和数据类型
- 为高帧率图像序列新增序列匹配模式
- 新增多相机系统的广义相对位姿求解器
- 新增稀疏最小绝对偏差求解器
- 自动重建工具增加CPU/GPU选项
- 通过Github实现Windows/Mac/Linux持续集成系统
- 大量错误修复与功能改进
COLMAP 3.1 (2017年6月15日发布)
- 在图像检索模块中新增快速空间验证功能
- 默认采用稀疏模型的二进制文件格式,旧版文本格式仍保持完全兼容,并支持通过GUI和CLI进行格式转换
- 新增跨平台小端序二进制文件读写功能
- 通过按需计算一致性及可选的融合图像尺寸限制,实现更快且更省内存的立体融合
- 简化的几何立体处理接口,现在单次处理即可完成几何立体输出计算
- 支持更快且多架构的CUDA编译
- 在自动重建器中新增中等质量选项
- 修复大量错误并进行了多项改进
COLMAP 3.0 (2017年5月22日)
- 新增自动端到端重建工具,可对给定图像集自动执行稀疏和密集重建
- 支持多GPU密集立体匹配(需多CUDA设备可用时)
- 支持多GPU特征匹配(需多CUDA设备可用时)
- 新增基于线检测的曼哈顿世界/重力方向对齐功能
- 新增基于CUDA的特征提取,适用于集群环境
- 新增基于CPU的特征匹配方案,适配无GPU设备
- 新增THIN_PRISM_FISHEYE相机模型(支持切向/径向畸变校正)
- 新增二进制工具用于三角化现有/空稀疏重建
- 新增二进制工具用于输出稀疏重建的统计摘要
- 新增传递性特征匹配以完善匹配图
- 通过缓存机制提升密集重建的可扩展性
- 改进GPU特征匹配稳定性并增加信息提示
- 采用FLANN动态调度加速词汇树匹配
- 使用线性索引替代kd-tree实现更快空间特征匹配
- 采用数值牛顿迭代法提升相机去畸变稳定性
- 改进选项解析机制(部分选项名称变更不向后兼容)
- 优化头文件包含和CUDA编译标志以加快编译速度
- 提升小基线场景下密集重建的视图选择稳定性
- 大量其他错误修复与改进
COLMAP 2.1 (2016年12月7日发布)
- 新增支持在词汇树匹配中仅索引和匹配特定图像
- 新增支持使用词汇树进行图像检索
- 对多视图立体模块进行了多项错误修复与改进
- 改进了运动恢复结构(SfM)初始化策略
- 新增支持仅使用数据库中的特定图像重建场景
- 新增支持通过已注册的重叠图像合并两个模型
- 新增支持通过已知相机位置进行地理配准/模型对齐
- 新增支持在特征提取模块中仅提取特定图像
- 新增支持在重建过程中导出快照模型
- 若输出目录已存在未失真图像则自动跳过处理
- 新增支持限制图像检索特征数量以提升速度
- 其他多项错误修复与改进
COLMAP 2.0 (2016年9月8日)
- 实现了密集重建流程
- 提升了特征匹配性能
- 新增针对刚性安装多相机系统的捆绑调整器
- 新增面向多相机系统的广义绝对位姿求解器
- 新增可执行程序用于从所有图像提取颜色
- 现在支持以共享和静态模式链接Boost库
- 多项错误修复和性能改进
COLMAP 1.1 (2016年5月19日发布)
- 采用汉明嵌入的先进图像检索系统实现,用于词汇树匹配。相比之前版本,这将显著提升匹配效果。
- 新增引导匹配作为可选功能。
- 提供新的演示数据集下载。
- 项目支持时自动切换至PBA模式。
- 在RANSAC中实现EPNP求解器用于局部位姿优化。
- 新增提取直立SIFT特征的选项。
- 导出时默认以超高质量保存JPEG图像。
- 增加清除项目匹配点和内点匹配的选项。
- 新增鱼眼相机模型,包括Google Project Tango采用的FOV相机模型(由Thomas Schoeps贡献)。
- 根据用户反馈扩展了文档内容。
- 修复文档中的拼写错误(由Thomas Schoeps修正)。
COLMAP 1.0 (2016年4月4日)
- COLMAP的初始版本发布。
贡献指南
https://colmap.github.io/contribution.html
我们非常欢迎各类贡献(错误报告、缺陷修复、功能改进等),请通过GitHub提交新的issue或pull request。
请注意遵守Google代码风格指南:
https://google.github.io/styleguide/cppguide.html
使用提供的“.clang-format”文件进行格式化。
用内联文档字符串描述函数、方法、类等的API,采用以下格式:
// Short description.
//
// Longer description with a few sentences and multiple lines.
//
// @param parameter1 Description for parameter 1、// @param parameter2 Description for parameter 2.
//
// @return Description of optional return value.
为所有新增代码添加单元测试,并确保算法的"改进"具有普适性,能在多种数据集上切实提升流水线的效果。
许可证
https://colmap.github.io/license.html
COLMAP 库采用新版 BSD 许可证授权。请注意,本文仅适用于 COLMAP 自身的许可证,与其第三方依赖项无关(这些依赖项采用各自独立的许可证)。使用这些依赖项构建 COLMAP 可能会影响最终产物的许可证。
Copyright (c), ETH Zurich and UNC Chapel Hill.
All rights reserved.Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:* Redistributions of source code must retain the above copyrightnotice, this list of conditions and the following disclaimer.* Redistributions in binary form must reproduce the above copyrightnotice, this list of conditions and the following disclaimer in thedocumentation and/or other materials provided with the distribution.* Neither the name of ETH Zurich and UNC Chapel Hill nor the names of its contributors may be used to endorse or promote products derivedfrom this software without specific prior written permission.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
参考文献
https://colmap.github.io/bibliography.html
[schoenberger_thesis]
Johannes L. Schönberger. “Robust Methods for Accurate
and Efficient 3D Modeling from Unstructured Imagery.” ETH Zürich, 2018.
[furukawa10]
Furukawa, Yasutaka, and Jean Ponce.
“Accurate, dense, and robust multiview stereopsis.”
Transactions on Pattern Analysis and Machine Intelligence, 2010.
[hofer16]
Hofer, M., Maurer, M., and Bischof, H.
Efficient 3D Scene Abstraction Using Line Segments,
Computer Vision and Image Understanding, 2016.
[jancosek11]
Jancosek, Michal, and Tomás Pajdla.
“Multi-view reconstruction preserving weakly-supported surfaces.”
Conference on Computer Vision and Pattern Recognition, 2011.
[kazhdan2013]
Kazhdan, Michael and Hoppe, Hugues
“Screened poisson surface reconstruction.”
ACM Transactions on Graphics (TOG), 2013.
[schoenberger16sfm]
Schönberger, Johannes Lutz and Frahm, Jan-Michael.
“Structure-from-Motion Revisited.” Conference on Computer Vision and
Pattern Recognition, 2016.
[schoenberger16mvs]
Schönberger, Johannes Lutz and Zheng, Enliang and
Pollefeys, Marc and Frahm, Jan-Michael.
“Pixelwise View Selection for Unstructured Multi-View Stereo.”
European Conference on Computer Vision, 2016.
[schoenberger16vote]
Schönberger, Johannes Lutz and Price, True and
Sattler, Torsten and Frahm, Jan-Michael and Pollefeys, Marc
“A Vote-and-Verify Strategy for Fast Spatial Verification in Image
Retrieval.” Asian Conference on Computer Vision, 2016.
[lowe04]
Lowe, David G. “Distinctive image features from scale-invariant
keypoints”. International journal of computer vision 60.2 (2004): 91-110.
[wu13]
Wu, Changchang. “Towards linear-time incremental structure from
motion.” International Conference 3D Vision, 2013.
历史文档
https://colmap.github.io/legacy.html
- v3.12 (2025-06-30)
- v3.11 (2024-11-28)
- v3.10 (2024-07-23)
- v3.9 (2024-01-06)
- v3.8 (2023-01-31)
2025-08-16(六)