COLMAP: Structure-from-Motion and Multi-View Stereo for Image Collections
COLMAP - Structure-from-Motion and Multi-View Stereo
At a glance
- What is it?
- COLMAP reconstructs 3D geometry from ordered or unordered photos through an SfM and MVS pipeline with GUI, CLI and Python interfaces. It is the reference open source implementation of the field, but its documentation is thin on failure modes and its output quality depends heavily on capture discipline.
- Who is it for?
- Adopt COLMAP if you need a general purpose SfM and MVS pipeline you can run from a GUI, a CLI or Python, and if you can accept that reconstruction quality is governed by your image capture rather than by any setting in the tool.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly C++, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 16, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What COLMAP solves, and who ends up using it
COLMAP is a general purpose Structure-from-Motion (SfM) and Multi-View Stereo (MVS) pipeline. The README describes it as offering "a wide range of features for reconstruction of ordered and unordered image collections." In plain terms: you give it a set of photographs of the same object or scene, and it estimates where each camera was and produces a dense 3D representation. Ordered collections means images taken in a sequence, such as a drone flight or a video frame extraction. Unordered means a bag of photos with no sequence information, which is the harder case and the one the vocabulary tree retrieval engine exists to handle.
The audience is narrower than the download numbers suggest. It is used by researchers who need a baseline for a paper, by engineers building photogrammetry or 3D reconstruction pipelines, and increasingly by people preparing camera poses for neural rendering work. The README lists the interfaces explicitly: a graphical interface and a command-line interface, plus Python bindings published as pycolmap on PyPI, with CUDA-enabled wheels under pycolmap-cuda12. That combination of GUI for inspection and CLI for scripting is the main reason it holds its position. A tool that only had one of the two would lose half its users.
The pipeline behind the single click reconstruction
The README's getting started flow is three steps: download binaries or build from source, get a sample dataset or use your own images, then run the automatic reconstruction, described as building models "with a single click or command." That single step hides a sequence. SfM first extracts features and matches them across views, then solves for camera poses and a sparse point cloud. MVS then takes those poses and computes depth per pixel, which is what the second cited paper, on pixelwise view selection, is about. The vocabulary tree engine handles image retrieval so that matching does not have to be exhaustive across every pair.
Two details in the README matter for anyone planning an integration. First, the project now includes a global SfM pipeline, GLOMAP, with its own citation (Pan et al., ECCV 2024). Incremental and global SfM are different strategies for the same problem: incremental reconstruction grows the model view by view and is the traditional COLMAP path, while global methods estimate all poses together. The README does not compare them or say when to choose which. Second, the acknowledgments name specific third-party dependencies, most notably ceres-solver, poselib, sift-gpu and vlfeat, and the README asks users to cite the original authors of specific algorithms. That is a signal that the pipeline is assembled from distinct components with distinct provenance, not a monolithic solver.
Installing COLMAP and running a first reconstruction
The README gives several installation routes rather than one. Windows binaries come from the GitHub releases page. Linux, Unix and BSD binaries are listed on repology. Pre-built Docker images are on Docker Hub under colmap/colmap. Conda users install with a single command. Python users get pycolmap from PyPI. Building from source is documented separately at colmap.github.io/install.html.
The conda route is the shortest path to a working reconstruction:
conda install colmapAfter that, the README's getting started section says to download one of the sample datasets from demuc.de/colmap/datasets/ or to use your own images. The datasets are the right first target because they remove capture quality as a variable. Once you have a folder of images, the automatic reconstruction is the entry point the README points to, and it is available both as a GUI action and as a command.
For Python work, the bindings are a separate install:
pip install pycolmapThe package requires Python 3.10 or later and depends on numpy, per pyproject.toml. If you have an NVIDIA GPU, the README points to pycolmap-cuda12 for CUDA-enabled wheels. AMD GPUs are supported through HIP/ROCm only when building from source, which the README states explicitly and which is the single most important platform caveat in the install section. If you are on an AMD card and unwilling to build, this is where the project stops being convenient.
Where COLMAP fails, and the cases it is the wrong tool for
The README is a getting started document, not a troubleshooting guide. It does not document rollback, and it does not describe what to do when automatic reconstruction produces a partial or empty model. That is a real gap for anyone running this unattended. The pipeline has many tunable stages, and the README does not enumerate them; the documentation site is where that material lives, and the README only links to it.
Capture conditions are the practical failure mode. Feature matching and MVS both depend on visual overlap and texture. The README says the software handles "ordered and unordered image collections" but says nothing about minimum overlap, texture requirements or how reflective and transparent surfaces behave. A user with a low-overlap or texture-poor set will get a sparse or fragmented model and no guidance from the README about which stage to inspect.
Hardware is the second boundary. GPU acceleration is clearly part of the intended workflow, given the CUDA wheels and the sift-gpu dependency, but the README never states which stages require a GPU and which run on CPU. If your environment has no GPU, you are not told what you are giving up. The third boundary is licensing scope: the README states that the BSD license text "refers only to the license for COLMAP itself, independent of its thirdparty dependencies, which are separately licensed," and warns that building with those dependencies may affect the resulting license. That is worth reading before shipping a product built on a source build.
COLMAP against GLOMAP, and against the rest of the field
The most relevant comparison is internal. GLOMAP is the global SfM pipeline now distributed with COLMAP and cited separately in the README. The difference in approach is the reconstruction strategy: incremental SfM adds cameras one at a time and refines as it goes, while global SfM estimates all camera poses jointly from the correspondence graph. Incremental methods are generally more tolerant of difficult image sets but slower and prone to drift accumulation; global methods avoid that drift but depend on the quality of the initial correspondence graph. The README does not state which is the default in automatic reconstruction, so verify that in the documentation before assuming either path.
Outside the project, the meaningful alternative is not another SfM tool but a different category of method entirely. Neural radiance field and Gaussian splatting pipelines also consume posed images and produce renderable scenes, and the search data around this project shows people asking how to use COLMAP for Gaussian splatting. That framing is accurate: COLMAP is the pose provider, not the renderer. If your goal is a viewable scene rather than a metric point cloud, you may end up running COLMAP only for the sparse stage and handing the poses to a separate renderer. That is a legitimate use, and it is a smaller commitment than running the full MVS stage.
Maintenance, releases and the upgrade question
The repository is not archived, and the last push was on 2026-09-15, one day before this writing. Recent releases include 4.2.0 on 2026-09-01, a model release for AnyCalib v1.0.0 on 2026-09-07, and a TartanAir V2 panoramic SfM benchmark on 2026-07-25. The cadence suggests the project ships both software releases and model or benchmark artifacts under the same release feed, which means anyone watching releases for upgrade signals has to filter out the non-software entries.
Upgrade cost is dominated by the build, not the API. The Python package version in pyproject.toml is 4.3.0.dev0 while the latest tagged software release is 4.2.0, so the bindings track a development line ahead of the last tag. The build-system requires scikit-build-core, a pinned pybind11, a stub generator pulled from a git URL, numpy, ruff and clang-format, and cibuildwheel builds across cp310 through cp314 on macOS, manylinux and Windows. That is a substantial toolchain. If you install from conda, PyPI or Docker, you inherit someone else's build and the cost is a version bump. If you build from source, you own that toolchain and every pinned version in it.
On licensing, the README is explicit that COLMAP itself is new BSD (BSD-3-Clause per pyproject.toml) and that third-party dependencies are separately licensed. It does not enumerate those licenses in the README. Whether that matters depends on how you distribute your build, and that is a question for your own legal review rather than something the README answers.
Editorial conclusion
Adopt COLMAP if you need a general purpose SfM and MVS pipeline you can run from a GUI, a CLI or Python, and if you can accept that reconstruction quality is governed by your image capture rather than by any setting in the tool. Do not adopt it if you need a documented rollback path for a failed reconstruction, or if you expect the README to explain why a model came out sparse: the README does not document rollback, and the automatic reconstruction is a single click or command with no described recovery step. Before committing, verify that your camera setup is supported by the calibration models in the install and documentation pages, and check the release page for the version that matches your platform, because the README points Windows users to GitHub releases, Linux users to repology, and everyone else to conda or Docker.
Frequently asked questions
What is COLMAP used for?
COLMAP is used to reconstruct 3D structure from collections of images. The README describes it as a general purpose Structure-from-Motion and Multi-View Stereo pipeline for ordered and unordered image collections, with both a graphical and a command-line interface.
Is COLMAP free?
Yes. The README states that the software is licensed under the new BSD license, and pyproject.toml lists the Python bindings as BSD-3-Clause. The README notes that third-party dependencies are separately licensed and that building with them may affect the resulting license.
Does COLMAP use the GPU?
The README points to CUDA-enabled Python wheels under pycolmap-cuda12 and lists sift-gpu among the third-party dependencies, and it states that AMD GPUs are supported via HIP/ROCm when building from source. It does not state which pipeline stages require a GPU.
Does COLMAP use GPS?
The README does not mention GPS or geotagging anywhere in its content. It describes reconstruction from image collections and does not document any use of location metadata, so this cannot be confirmed from the available material.
How do I install COLMAP?
The README lists several routes: Windows binaries from the GitHub releases page, Linux/Unix/BSD binaries via repology, pre-built Docker images at hub.docker.com/r/colmap/colmap, conda packages installed with conda install colmap, and Python bindings from PyPI as pycolmap. Building from source is documented at colmap.github.io/install.html.
How do I use GLOMAP in COLMAP?
The README states that COLMAP includes a global SfM pipeline, GLOMAP, and provides a separate citation for it (Pan et al., ECCV 2024). It does not describe how to select GLOMAP over the incremental pipeline, so that detail has to come from the documentation site.
Community notes