Releases: colmap/colmap
Releases Β· colmap/colmap
3.12.1
3.12.0
COLMAP 3.12.0 (06/30/2025)
New Features
- Support for modeling sensor rigs (and thus multi-camera rigs and panoramas).
For more details and usage examples, see: https://colmap.github.io/rigs.html. - Automatic download and caching of vocabulary trees and other resources.
- Support for converting between LLA and UTM coordinates.
- Improved minimal solvers for affine transform and generalized absolute/relative pose.
- Improved absolute pose estimation by minimizing pixel error in image space.
- Replaced FLANN with faiss for fast approximate nearest neighbor search
for improved speed in CPU-based feature matching and vocabulary tree-based image retrieval. - Support for propagating relative pose covariance.
- Support visualization of models with arbitrary origin and scale (e.g., in GPS space).
- Reconstruction benchmark for ETH3D, IMC, BlendedMVS datasets.
- Measure and report code test coverage in CI.
Bug Fixes
- Fixed RANSAC stopping criterion, see https://arxiv.org/pdf/2503.07829.
- Fixed and improved two-view pose and triangulation angle estimation.
- Fix rare deadlock during vocab tree feature matching.
- For other bug fixes, see full list of changes below.
Breaking Changes
- Serialization of reconstruction and database contains a new abstraction: rigs and frames.
The reconstruction output contains two new filesrigs.{bin,txt}
andframes.{bin,txt}
.
The database contains new tables:rigs
,rig_sensors
,frames
,frames_data
.
Reading from existing reconstructions and databases (without rigs/frames) is fully backwards
compatible and vice versa reading new reconstructions (with rigs/frames) using old code is
fully forwards compatible. - Sensor poses (and thus image poses) are now composed as:
sensor_from_world = sensor_from_rig * rig_from_world
. Previously,image.cam_from_world
returned a reference to the pose parameters. Now it returns a copy of the pose composition:
image.cam_from_world() = image.frame.rig.sensor_from_rig(image.camera.sensor_id) * image.frame.rig_from_world
with the underlying pose parameters stored in the rig and frame objects. - Default bundle adjuster supports sensor rigs and thus rig bundle adjuster is deprecated.
- FLANN-based vocabulary trees are incompatible with faiss. New trees automatically
downloaded, if no vocab_tree_path is provided, otherwise manual download and update required. - Removed official support for Ubuntu 20.04, MacOS 13, and Visual Studio 2019. 8000
Full Change List (sorted temporally)
- Cancel previous Github action runs upon push by @ahojnnes in #2998
- Fix ccache installation in pycolmap windows CI by @ahojnnes in #2997
- Use Azure blob storage as vcpkg binary cache by @ahojnnes in #2999
- Add missing openmp flags in retrieval for flann parallelization by @ahojnnes in #3018
- Separate read and write SAS tokens for vcpkg binary cache by @ahojnnes in #3027
- Define vcpkg binary cache source inline by @ahojnnes in #3028
- Fix conditional vcpkg binary cache config in bash by @ahojnnes in #3031
- Avoid absolute path for the include directory installation by @jhacsonmeza in #3024
- Add conversion between LLA and UTM coords. by @StonerLing in #3030
- Improve interface for ReadWriteBinaryBlob and add tests by @ahojnnes in #3033
- Add support for downloading files by @ahojnnes in #3022
- Add function to compute sha256 digest by @ahojnnes in #3035
- Automatically download and cache vocabulary tree by @ahojnnes in #3036
- Set vcpkg default features and synchronize to latest vcpkg by @ahojnnes in #3038
- Avoid unnecessary copy of input elements in Percentile/Median by @ahojnnes in #3039
- Abstract algorithm class IncrementalMapperImpl by @B1ueber2y in #3040
- Perform linear interpolation in percentile computation by @ahojnnes in #3041
- Avoid dependent inputs in IncrementalMapperImpl by @B1ueber2y in #3043
- Reorder destructors for better safety in EndReconstruction by @B1ueber2y in #3046
- Improvements for reconstruction normalization / bbox / centroid by @ahojnnes in #3047
- Speedup affine transform minimal solver, create python bindings by @ahojnnes in #3049
- Fix compilation with DOWNLOAD_ENABLED=OFF by @ahojnnes in #3053
- Consistent interface/tests for rigid3d/sim3d/affine2d, pycolmap bindings for rigid3d by @ahojnnes in #3051
- Improve logging for errors in masking during feature extraction by @Ambrosiussen in #3034
- Add copy constructor support for solver-related ceres bindings by @B1ueber2y in #3059
- Minor fix on using pycolmap bundle adjuster with pyceres by @B1ueber2y in #3060
- Re-enable interface support for covariance estimation from a Ceres::Problem instance by @B1ueber2y in #3061
- Only cancel CI runs in PRs and not in main/release branches by @ahojnnes in #3063
- Add binding support for invalid values in pycolmap id types by @B1ueber2y in #3072
- Fix custom quality level in ETH3D benchmark by @ahojnnes in #3076
- Set max_num_features automatically per quality level by @ahojnnes in #3077
- Make it possible to build the MVS doc even when CUDA is not installed by @sarlinpe in #3078
- Temporarily disable ccache in the pycolmap macOS CI by @sarlinpe in #3084
- Add option to specify image list in automatic reconstruction by @ahojnnes in #3074
- Only create OpenGL context in automatic reconstruction if necessary by @ahojnnes in #3075
- Remove unnecessary braces around initializer in pycolmap/covariance by @ahojnnes in #3080
- Remove temporary fixes for macOS CI by @sarlinpe in #2954
- Reconstruction benchmark by @ahojnnes in #2714
- Re-enable ccache in pycolmap Mac CI by @sarlinpe in #3085
- Fix transitive completion in incremental triangulator by @ahojnnes in #3094
- Fix image deletion, hide point viewer widget after deletion by @ahojnnes in #3098
- Fix download functionality under Windows by @ahojnnes in #3099
- Add back detailed logs for covariance estimation by @B1ueber2y in #3082
- Fix reprojection error in camera rig cost function by @binbin-xu in #3106
- Install missing libcurl4 runtime library in dockerfile by @ahojnnes in #3122
- Expose incremental mapper pose prior options in pycolmap by @ahojnnes in #3123
- Remove year from copyright by @ahojnnes in #3124
- Use poselib for generalized absolute pose minimal solver by @ahojnnes in #3125
- Add code coverage reporting by @ahojnnes in #3126
- Fix synthetic prior generation when stddev=0 by @ahojnnes in #3128
- Create temporary colmap test directy under system test directory by @ahojnnes in < 8000 a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2820591542" data-permission-text="Title is private" data-url="https://github.com/colmap/colmap/issues/3129" data-hovercard-type="pull_request" data-hovercard-url="/colmap/colmap/pull/3129/hovercard" href="https://github.com/colmap/colmap/pull/3129">#3129
- Minor: pyceres is no longer a must for running pycolmap bundle adjuster by @B1ueber2y in #3130
- Fix cost functor convention for benchmarking by @B1ueber2y in #3131
- Support enum from string conversion by @ahojnnes in #3132
- More robustly handle degenerate triangulation angles by @ahojnnes in #3135
- Minor: add missing empty namespace in alignment testing script by @B1ueber2y in #3137
- Add frame impl for future rig support by @B1ueber2y in #2698
- Rename RigCalibration to RigCalib by @ahojnnes in #3142
- Fix and improve two-view pose and triangulation angle estimation by @ahojnnes in #3146
- Fix covariance propagation of pose inverse by @B1ueber2y in #3155
- [Spherical Camera Support] Change essential matrix estimation to use camera rays by @ahojnnes in #3159
- Improve incremental mapper initialization logic by @ahojnnes in #3161
- Improved RANSAC dependency injection by @ahojnnes in #3165
- Add docs on the left convention in COLMAP for covariance propagation. by @B1ueber2y in https:/...
3.11.1
Bug Fixes
- Fix typo in pycolmap function align_reconstruction_to_locations interface by @B1ueber2y in #2961
- Add back some ceres bindings to use pycolmap bundle adjustment without pyceres by @B1ueber2y in #2985
- Fix setting of RANSAC max error in pose prior BA alignment by @ahojnnes in #2993
Full Changelog: 3.11.0...3.11.1
3.11.0
New Features
- New pose prior based incremental mapper that can leverage absolute pose priors from e.g. GPS measurements.
- New bundle adjustment covariance estimation functionality. Significantly faster and more robust than Ceres.
- API documentation with auto-generated stubs for pycolmap.
- Use PoseLib's minimal solvers for faster performance and improved robustness.
- Experimental support for CUDA-based bundle adjustment through Ceres (disabled by default).
- Support for reading 16-bit PNG grayscale images.
- New RAD_TAN_THIN_PRISM_FISHEYE camera model in support of Meta's Project Aria devices.
- Replace numerical with analytical Jacobian in image undistortion for better convergence.
- Many more performance optimizations and other improvements. See full list of changes below.
Bug Fixes
- Fixed non-deterministic behavior of CUDA SIFT feature extractor. Broken since 3.10 release.
- Fixed orientation detection of covariant/affine SIFT feature extractor. Broken since initial release.
- Fixed point triangulator crashing due to bug in observation manager. Broken since 3.10 release.
- Fixed sequential feature matcher overlap missing the farthest image. Broken since initial release.
- Fixed rare deadlock during matching due to concurrent database access. Broken since 3.10 release.
- Fixed little/big endian detection. Broken since 3.1 release.
- For other bug fixes, see full list of changes below.
Breaking Changes
- Dropped official support for Ubuntu 18.04, Visual Studio 2019.
- Upgrade to C++17 standard in C++ and C++14 in CUDA source code.
- New
pose_priors
table in database in support of pose prior based mapper. - PyCOLMAP API:
align_reconstrution_to_locations
is renamed toalign_reconstruction_to_locations
(typo).pycomap.cost_functions
becomes a module and should be explicitly imported asimport pycolmap.cost_functions
.- Replaced
Image.registered
byImage.{has_pose,reset_pose}
. - Replaced
Image.{get_valid_point2D_ids,get_valid_points2D}
byImage.{get_observation_point2D_idxs,get_observation_points2D}
. - Replaced
Track.{append,remove}
byTrack.{add_element,delete_element}
. AbsolutePoseErrorCost
becomesAbsolutePosePriorCost
.MetricRelativePoseErrorCost
becomesRelativePosePriorCost
.- The signature of
ReprojErrorCost
and related cost functions was changed: arguments are reordered, the detection uncertainty is now a 2x2 covariance matrix. BundleAdjuster
becomes virtual and should be created withpycolmap.create_default_bundle_adjuster()
.absolute_pose_estimation
becomesestimate_and_refine_absolute_pose
.pose_refinement
becomesrefine_absolute_pose
.essential_matrix_estimation
becomesestimate_essential_matrix
.fundamental_matrix_estimation
becomesestimate_fundamental_matrix
.rig_absolute_pose_estimation
becomesestimate_and_refine_generalized_absolute_pose
.homography_matrix_estimation
becomesestimate_homography_matrix
.squared_sampson_error
becomescompute_squared_sampson_error
.homography_decomposition
becomespose_from_homography_matrix
.Rigid3d.essential_matrix
becomespycolmap.essential_matrix_from_pose
.
Full Change List (sorted temporally)
- Updates for pycolmap by @ahojnnes in #2672
- Trigger CI on release/* branches by @ahojnnes in #2673
- Use consistent versioning scheme between C++/Python by @ahojnnes in #2674
- Add cost function for 3D alignment (with covariance) by @B1ueber2y in #2621
- Numpy 2 compatibility by @sarlinpe in #2682
- Add fix for specifying the correct pycolmap CMake python development β¦ by @fulkast in #2683
- Remove non existant flags of model_aligner from docs by @TamirCohen in #2696
- Reset CMAKE_MODULE_PATH to previous value by @mvieth in #2699
- Robustify nchoosek against overflow by @ahojnnes in #2706
- Observation manager needs to check if image_id exists before query operations by @bo-rc in #2704
- Remove pose prior from database.py:add_image by @sarlinpe in #2707
- Fix: sequential matcher overlap number should be inclusive by @flm8620 in #2701
- Fix table mangled by clang-format by @sweber1 in #2710
- Write out options to ini in full precision, relax bundle adjuster convergence by @ahojnnes in #2713
- Tests for pairing library in feature matching by @ahojnnes in #2711
- Rename IncrementalMapperOptions to IncrementalPipelineOptions by @B1ueber2y in #2708
- Add support for CUDA sparse BA solver by @ahojnnes in #2717
- Rename HierarchicalMapperController to HierarchicalPipeline by @ahojnnes in #2718
- Make VisualIndex::Quantize const to improve readability by @IshitaTakeshi in #2723
- Fix CUDA_ENABLED macro in new bundle adjustment code by @drkoller in #2725
- Automatically generate stub files by @sarlinpe in #2721
- Add CUDA-based dense BA solver by @ahojnnes in #2732
- Improved and simplified caching in feature matching by @ahojnnes in #2731
- Fix colmap namespace in the macro support of logging. by @B1ueber2y in #2733
- Add callbacks by move by @ahojnnes in #2734
- Implement transitive matcher with pair generator + tests by @ahojnnes in #2735
- Provide reasonable defaults for some estimator options by @sarlinpe in #2745
- Fix mismatched Delaunay meshing options by @sarlinpe in #2748
- PyCOLMAP API documentation by @sarlinpe in #2749
- Improved pycolmap coverage and docs by @sarlinpe in #2752
- Follow-up fixes in pycolmap by @sarlinpe in #2755
- Report errors in import_images by @sarlinpe in #2750
- Further simplification of feature matcher code by @ahojnnes in #2744
- Add missing ClearModifiedPoints3D by @sarlinpe in #2761
- Store shared camera ptr for reconstruction images by @ahojnnes in #2762
- Avoid unnecessary copy of queue in IncrementalTriangulator::Complete() by @ahojnnes in #2764
- Branch prediction for THROW_CHECK_NOTNULL by @ahojnnes in #2765
- Use shared camera pointer in more places by @ahojnnes in #2763
- Support switching camera directly with camera pointer by @B1ueber2y in #2767
- Add test for MergeReconstructions by @B1ueber2y in #2766
- Fix little/big endian detection by @ahojnnes in #2768
- Fix options for CUDA sparse BA solver by @whuaegeanse in #2758
- Rename SupperMeasurer::Compare for improved readability by @ahojnnes in #2774
- Improvements for install docs by @ahojnnes in #2773
- fixed typo of align_reconstrution_to_locations to align_reconstructio⦠by @TamirCohen in #2776
- Fix missing camera ptr for Reconstruction.DeleteAllPoints2DAndPoints3D() by @B1ueber2y in #2779
- Rename remaining proj_matrix instances to cam_from_world by @ahojnnes in #2780
- Relative pose decomposition uses Rigid3d by @ahojnnes in #2781
- Minor renaming on pycolmap point2d and point3d filenames by @B1ueber2y in #2784
- Add validity check for pixel coordinate in the Fisheye camera. Fix tests. by @B1ueber2y in #2790
- Use branch prediction in PRNG functions by @ahojnnes in #2796
- Implementation of Aria Fisheye camera model by @nushakrishnan in #2786
- Upgrade to C++ 17 by @B1ueber2y in #2801
- Pose Prior based Incremental Mapper by @ferreram in #2660
- Expose UpdatePoint3DErrors to pycolmap by @theartful in #2805
- Switch to the Ruff Python formatter by @sarlinpe in #2803
- Add mixed Python-C++ PyCOLMAP package by @sarlinpe in #2747
- Enable Ruff linter for Python by @sarlinpe in #2806
- Use C++17 structured bindings in some places by @ahojnnes in #2808
- Add RAD_TAN_THIN_PRISM_FISHEYE to camera docs by @ahojnnes in #2810
- Customized cost functions should be functors instead by @B1ueber2y in https://git...
3.10
What's Changed
- Increment dev version number to 3.10 by @ahojnnes in #2320
- Replace std::string with constant chars by @whuaegeanse in #2321
- Remove unused SelectCudaComputeArch.cmake by @ahojnnes in #2322
- Document VS dev shell in install instructions by @ahojnnes in #2323
- Remove custom config for unsupported ubuntu 16.04 by @ahojnnes in #2324
- Changelog for release 3.9 by @ahojnnes in #2326
- Update deprecated nuget authenticate ADO pipeline task by @ahojnnes in #2327
- Disable noisy MSVC warnings and fix remaining relevant ones by @ahojnnes in #2328
- Fully encapsulate freeimage in bitmap library by @ahojnnes in #2332
- Link against the release version dependencies when building with vcpkg by @whuaegeanse in #2331
- Add changelog for 3.9.1 patch release by @ahojnnes in #2336
- Add missing "include " needed for unique_ptr by @Tobias-Fischer in #2338
- Support decoding multi-byte characters in Python script by @jot-jt in #2344
- Split Dockerfile in two stages: builder and runtime. by @pablospe in #2347
- Dockerfile improvements by @pablospe in #2356
- Update VCPKG commit in Windows CI by @sarlinpe in #2365
- Simplify the creation of reprojection error cost functions by @sarlinpe in #2364
- Migrate pycolmap by @sarlinpe in #2367
- Rename master -> main in pycolmap CI by @sarlinpe in #2370
- Bind SetPRNGSeed by @sarlinpe in #2369
- Encapsulate freeimage usage from pycolmap in colmap bitmap by @ahojnnes in #2372
- Re-generate version info on git changes by @ahojnnes in #2373
- Consolidate colmap/pycolmap readmes, updated acknowledgements, etc. by @ahojnnes in #2374
- Fix crashing pycolmap CI on Windows by @sarlinpe in #2383
- Add costs for pose graph optimization by @sarlinpe in #2378
- Switch to exception checks - v2 by @sarlinpe in #2376
- Cleanup checks in pycolmap by @sarlinpe in #2388
- Add RigReprojErrorConstantRigCostFunction by @sarlinpe in #2377
- Add cost functions to pycolmap by @sarlinpe in #2393
- Fix warning C4722 by @whuaegeanse in #2391
- Move reconstruction IO utils to a new file by @sarlinpe in #2399
- Acquire the GIL before returning None by @sarlinpe in #2400
- Disentangle the controller from threading and integrate the new logic into IncrementalMapperController by @B1ueber2y in #2392
- Simplify the low-level triangulation API by @sarlinpe in #2402
- Initialize glog in pycolmap only if not already done by @sarlinpe in #2405
- Adapt all the controllers to inherit from BaseController rather than Thread (except for feature extraction and matching) by @B1ueber2y in #2406
- Update path to models.h in database docs by @diffner in #2412
- Migrate Ubuntu CI pipelines from ADO to Github by @ahojnnes in #2411
- Build wheels for Python 3.12 by @sarlinpe in #2416
- Migrate MacOS CI pipeline from ADO to Github by @ahojnnes in #2418
- Improve bindings of Database by @sarlinpe in #2413
- Migrate Windows CI pipeline from ADO to Github by @ahojnnes in #2419
- Reduce logging during incremental mapping by @sarlinpe in #2420
- Migrate Docker CI from ADO to Github, remove ADO pipelines by @ahojnnes in #2422
- Simplify IncrementalMapperController by @sarlinpe in #2421
- Fix for glog 0.7.0 by @sarlinpe in #2428
- Fix typo by @whuaegeanse in #2430
- Fix RunMapper by @whuaegeanse in #2431
- Do triangulation in the IncrementalMapperController by @sarlinpe in #2429
- Only push a new Docker image on release by @sarlinpe in #2436
- model aligner with type "custom" does not update reconstruction by @lpanaf in #2433
- Define vcpkg manifest by @ahojnnes in #2426
- Fix ordering of keyword arguments in pycolmap.rig_absolute_pose_estimation by @sarlinpe in #2440
- Reduce the build time of pycolmap by @sarlinpe in #2443
- Improve bindings of CorrespondenceGraph by @sarlinpe in #2476
- Bind Reconstruction::{SetUp,ImagePairStats} by @sarlinpe in #2477
- Add bindings for substeps of incremental mapper with a python example by @B1ueber2y in #2478
- Debug crashing VCPKG-based CI builds by @sarlinpe in #2508
- Upgrade to pybind11 v2.12. Fix bind_map and reconstruction.points3D by @B1ueber2y in #2502
- Minor fix on logging for the pycolmap customized runner by @B1ueber2y in #2503
- Fix missing public link deps, break circular feature-scene dependency by @ahojnnes in #2497
- Avoid duplicate image allocation during undistortion by @fseegraeber in #2520
- Fix reconstruction.points3D by @B1ueber2y in #2523
- Fix 'std::out_of_range' error when using hierarchical_mapper by @GrayMask in #2526
- Fix binding for std::vector by @sarlinpe in #2533
- Include pybind eigen header by @tmnku in #2510
- Fix pycolmap python pipeline for multiple models by @B1ueber2y in #2531
- make two view geometry writable by @tmnku in #2540
- Customized python interface for bundle adjustment by @B1ueber2y in #2509
- Fix typos by @MaximSmolskiy in #2553
- Implicitly convert iterator to ListPoint2D by @sarlinpe in #2558
- Fix model_cropper not resetting image.num_points3D of cropped_rec by @ArneSchulzTUBS in #2557
- Split pair generation and matching by @sarlinpe in #2573
- Add ObservationManager by @sarlinpe in #2575
- Log info about created feature extractor/matcher types by @ahojnnes in #2579
- LSD: making the AGPL dependency optional by @zap150 in #2578
- Disable LSD when building pycolmap wheels by @sarlinpe in #2580
- Synthesize full two-view geometry and raw matches by @ahojnnes in #2595
- Support Adjoint matrix computation for Rigid3d by @B1ueber2y in #2598
- Fix cost functions for pose graph optimization by @B1ueber2y in #2601
- Fix python bundle adjustment example with pyceres by @B1ueber2y in #2606
- Faster homography estimator by @ahojnnes in #2603
- Add function to find real cubic polynomial roots by @ahojnnes in #2609
- Align with the convention of ceres doc on SqrtInformation. by @B1ueber2y in #2611
- Faster 7-point fundamental matrix estimator by @ahojnnes in #2612
- Faster 8-point fundamental matrix estimator by @ahojnnes in #2613
- Covariance estimation for bundle adjustment with Schur elimination by @B1ueber2y in #2610
- Mac OS improvements by @BSVogler in #2622
- Update cibuildwheel to 2.19.2 by @ahojnnes in #2632
- Faster essential matrix estimators by @ahojnnes in #2618
- Remove CamFromWorldPrior and create LocationPrior by @sarlinpe in #2620
- Add option to disable uninstall target, restore CI pipeline by @ahojnnes in #2634
- Faster covariance computation for small blocks by @B1ueber2y in #2633
- Fix optimal point algorithm by @morrishelle in https:...
3.9.1
3.9
What's Changed
- clang format all code and require clang-format-14 by @ahojnnes in #1785
- Fix compilation for vcpkg windows build by @ahojnnes in #1791
- Increment version number to 3.9 by @ahojnnes in #1794
- Remove unnecessary /arch:sse2 flag for MSVC by @ahojnnes in #1798
- Updated faq.rst by @CGCooke in #1801
- Fixed mistake in code comment for OpenCV Fisheye camera by @CGCooke in #1802
- Replace deprecated cudaThreadSynchronize with cudaDeviceSynchronize by @ahojnnes in #1806
- Replace deprecated Cuda texture references with texture objects by @ahojnnes in #1809
- Remove unused SIFT GPU cuda texture reference by @ahojnnes in #1823
- Upgrade SiftGPU to use CUDA texture objects by @ahojnnes in #1838
- Remove PBA as bundle adjustment backend to support CUDA 12+ by @ahojnnes in #1840
- Replace deprecated CUDA sature function call by @ahojnnes in #1841
- Avoid unnecessary mallocs during sampling by @ahojnnes in #1842
- Cleaned up docker readme and scripts by @ahojnnes in #1852
- add "Shared intrinsics per sub-folder" checkbox to automatic reconstruction window by @kenshi84 in #1853
- Update vcpkg by @ahojnnes in #1925
- Log the name of the file that causes Mat::Read() to checkfail by @SomeAlphabetGuy in #1923
- check Z_index correctly in ReadPly by @countywest in #1896
- Don't re-open files when reading and writing matrices by @SomeAlphabetGuy in #1926
- Update vcpkg to latest commit by @ahojnnes in #1948
- Remove unnecessary custom Eigen aligned allocator macros by @ahojnnes in #1947
- Prefix internal sources/includes with colmap by @ahojnnes in #1949
- Simplify clang-format config and sort includes by @ahojnnes in #1950
- Handle possible overflow in median function by @ahojnnes in #1951
- Run ASan pipeline under Ubuntu 22.04 by @ahojnnes in #1952
- Fix Ceres version test by @drkoller in #1954
- Fix deprecation warning for Qt font metrics width by @ahojnnes in #1958
- Setup clang-tidy and enable perf warnings by @ahojnnes in #1959
- VCPKG binary caching for windows CI by @ahojnnes in #1957
- Cosmetics for VS dev shell script by @ahojnnes in #1965
- Enable clang-tidy concurrency checks by @ahojnnes in #1967
- [Bug] fix finding shared points3D in FindLocalBundle by @wesleyliwei in #1963
- Enable compiler caching in CI F438 by @ahojnnes in #1972
- Set number of features for different quality levels by @ahojnnes in #1975
- Specify parameter name using inline comment by @ahojnnes in #1976
- Fix Windows CCache by @ahojnnes in #1977
- Add e2e tests in CI pipeline using ETH3D datasets by @ahojnnes in #1397
- [feature] print verbose information for model analyzer by @wesleyliwei in #1978
- Add a missing include to compile with gcc13 by @EstebanDugueperoux2 in #1984
- Speed up snapshot construct in RigBundleAdjuster by @wesleyliwei in #1988
- Update outdated docker cuda image tag by @ahojnnes in #1992
- Add boulders ETH3D dataset to CI E2E tests by @ahojnnes in #1991
- Update executable paths in documentation by @ahojnnes in #1993
- Avoid unnecessary copy in ExtractTopScaleFeatures by @ahojnnes in #1994
- Move related code under new image library folder by @ahojnnes in #1995
- Move related code under new camera folder by @ahojnnes in #1996
- Added a virtual destructor to Sampler by @SomeAlphabetGuy in #2000
- Add a few more clang-tidy checks by @ahojnnes in #2001
- Move related code to new geometry module by @ahojnnes in #2006
- Use #pragma once as include guard by @ahojnnes in #2007
- Add bugprone-* clang-tidy checks by @ahojnnes in #2010
- Avoid const params in declarations by @ahojnnes in #2011
- Set and require C++14 by @ahojnnes in #2012
- Cleanup math functions that are now part of eigen/stdlib by @ahojnnes in #2013
- Add clang-analyzer checks by @ahojnnes in #2014
- Replace CMake provided find_package scripts and modern CMake targets by @ahojnnes in #2016
- Switch from Boost unit tests to Gtest by @ahojnnes in #2017
- Fix ccache restore keys in pipeline caching by @ahojnnes in #2018
- Add missing cacheHitVar to fix ccache by @ahojnnes in #2020
- Add missing Boost::graph import by @sarlinpe in #2021
- Compressed/flattened correspondence graph for faster triangulation / less memory by @ahojnnes in #2019
- Fix window ccache key by @ahojnnes in #2024
- Consistently use shared_ptr for shared pointers for SFM objects by @ahojnnes in #2023
- Remove check on Qt version by @sarlinpe in #2022
- Synthetics for E2E incremental mapper tests by @ahojnnes in #2025
- New math module by @ahojnnes in #2028
- Simplify similarity transform and more tests by @ahojnnes in #2030
- Extract reconstruction alignment functions into new file by @ahojnnes in #2032
- Add E2E hierarchical mapper tests by @ahojnnes in #2033
- Rename SimilarityTransform3 to Sim3d by @ahojnnes in #2034
- Add Rigid3d transform class by @ahojnnes in #2035
- Consolidate and simplify Rigid3d and Sim3d by @ahojnnes in #2037
- Some small improvements/cleanup for rigid3d/sim3d usage by @ahojnnes in #2041
- CamFromWorld replaces qvec/tvec by @ahojnnes in #2039
- Retry download of ETH3D datasets by @ahojnnes in #2043
- WorldToImage becomes CamToImg by @ahojnnes in #2044
- Camera models operate on camera rays by @ahojnnes in #2045
- Ignore directory .vs by @whuaegeanse in #2046
- Use the reference of Rigid3d to reduce memory consumption by @whuaegeanse in #2047
- Inline point to image projection by @ahojnnes in #2050
- Point2D becomes simpler pure data struct by @ahojnnes in #2051
- Use Eigen math for estimator utils by @ahojnnes in #2052
- Move cost functions under geometry module and rename by @ahojnnes in #2053
- Bundle adjuster is an estimator by @ahojnnes in #2054
- Remaining base targets move to new scene module by @ahojnnes in #2055
- Vote and verify improvements/speedup by @ahojnnes in #2056
- Generate version info in .cc file to reduce number of recompilations by @ahojnnes in #2057
- Option manager moves to controllers to disentangle circular deps by @ahojnnes in #2058
- Granular CMake modules and build targets by @ahojnnes in #2059
- Fix docker build by @ahojnnes in #2069
- Remove warnings about duplicated marco NOMINMAX by @whuaegeanse in #2067
- lib folder becomes thirdparty folder by @ahojnnes in #2068
- Remove unnecessary checks in image pair conversion by @ahojnnes in #2074
- Replace flaky ETH3D terrace with courtyard dataset by @ahojnnes in #2075
- Synthesize chained match graph for more mapper tests by @ahojnnes in https://github.com/colmap/colmap/p...
3.8
What's Changed
- Updating geo-registration doc. by @ferreram in #1410
- Adding user-specified option for reconstructing purely planar scene. β¦ by @ferreram in #1408
- Only apply sqlite vacuum command when elements are deleted from the database. by @ferreram in #1414
- Replace Graclus with Metis dependency by @ahojnnes in #1422
- Update ceres download URL in build script by @whuaegeanse in #1430
- Fix type errors when building colmap with build.py in windows by @whuaegeanse in #1440
- Fix bug in the computation of the statistics Global/Local BA by @whuaegeanse in #1449
- Add RefineGeneralizedAbsolutePose and covariance estimation by @skydes in #1464
- Update docker image definition by @ahojnnes in #1478
- Upgrade deprecated ceres parameterizations to manifolds by @ahojnnes in #1477
- Use masks for stereo fusion on automatic reconstruction by @ibrarmalik in #1488
- fix random seed set failed from external interface by @WZG3661 in #1498
- Replace deprecated Eigen nonZeros() call for most recent Eigen versions. by @nackjaylor in #1494
- Fix ceres-solver folder name by @f-fl0 in #1501
- Improved convergence criterion for XYZ to ELL conversion by @ahojnnes in #1505
- Fix bug in the function SetPtr of Bitmap by @whuaegeanse in #1525
- Avoid the calling of copy constructor/assignment by @whuaegeanse in #1524
- Avoid calling copy constructors of FeatureKeypoints and FeatureDescriptors by @whuaegeanse in #1540
- Initialize freeimage if statically linked by @ahojnnes in #1549
- Avoid hard crash if Jacobian matrix is rank deficient by @mihaidusmanu in #1557
- visualize_model.py: added FULL_OPENCV model by @soeroesg in #1552
- Update vcpkg version to fix CI pipeline by @ahojnnes in #1568
- Replace deprecated Mac OS 10.15 with Mac OS 12 build in CI by @ahojnnes in #1569
- Fix inconsistent between the actual executed image reader option and the saved project.ini file by @xuchenghust in #1564
- checkout the expected version of ceres solver by @scott-vsi in #1576
- use default qt5 brew install directory #1573 by @catapulta in #1574
- Fix image undistortion with nested image folders by @ahojnnes in #1606
- Fix source file permissions by @ahojnnes in #1607
- Fixed the collection of arguments in colmap.bat by @tdegraaff in #1121
- Add OpenMP to COLMAP_EXTERNAL_LIBRARIES if enabled by @logchan in #1632
- Fix output tile reconstructions are the same as the input reconstruction in
RunModelSplitter
(#1513) by @Serenitysmk in #1531 - add
libmetis-dev
to solveMETIS_INCLUDE_DIRS
. by @FavorMylikes in #1672 - Update install.rst by @tomer-grin in #1671
- Update freeimage links. by @Yulv-git in #1675
- fix small typo by @skal65535 in #1668
- Update build.py with new glew link by @aghand0ur in #1658
- Add use_cache in fusion options GUI by @hrflr in #1655
- Add CI pipeline for Ubuntu 22.04 by @ahojnnes in #1688
- Avoid unnecessary copies of data by @ahojnnes in #1691
- Reduce memory allocations in correspondence graph search by @ahojnnes in #1692
- Use FindCUDAToolkit when available. by @hanseuljun in #1693
- Fixed a crash due to inconsistent undistortion by @SomeAlphabetGuy in #1698
- Add CUDA Ubuntu 22.04 CI build by @ahojnnes in #1705
- Delete the redundancy install of libmetis-dev by @thomas-graphopti in #1721
- Fix broken loading of image masks on macOS by @buesma in #1639
- Update install instructions with latest hints and known issues by @ahojnnes in #1736
- Modernize smart pointer initialization, fix alloc/dealloc mismatch by @ahojnnes in #1737
- Fix typo in cli.rst by @ojhernandez in #1747
- Fix inconsistent image resizing between CPU/GPU implementations of SIFT by @Yzhbuaa in #1642
- Reduce number of SIFT test features to make tests run under WSL by @ahojnnes in #1748
- Tag documentation version with dev by @ahojnnes in #1749
- Update copyright to 2023 by @ahojnnes in #1750
- Fix max image dimension for positive first_octave by @ahojnnes in #1751
- Fix SIFT GPU match creation by @ahojnnes in #1757
- Fix SIFT tests for OpenGL by @ahojnnes in #1762
- Suppress CUDA stack size warning for ptxas by @ahojnnes in #1770
- Simplify CUDA CMake configuration by @ahojnnes in #1776
- Fixes for CUDA compilation by @ahojnnes in #1777
- Improvements to dockerfile and build pipeline by @ahojnnes in #1778
- Explicitly require CMAKE_CUDA_ARCHITECTURES to be defined by @ahojnnes in #1781
- Depend on system installed FLANN by @ahojnnes in #1782
- Option to store relative pose between two cameras in database by @yanxke in #1774
- Depend on system installed SQLite3 by @ahojnnes in #1783
New Contributors
- @ibrarmalik made their first contribution in #1488
- @WZG3661 made their first contribution in #1498
- @nackjaylor made their first contribution in #1494
- @f-fl0 made their first contribution in #1501
- @soeroesg made their first contribution in #1552
- @xuchenghust made their first contribution in #1564
- @scott-vsi made their first contribution in #1576
- @catapulta made their first contribution in #1574
- @tdegraaff made their first contribution in #1121
- @logchan made their first contribution in #1632
- @Serenitysmk made their first contribution in #1531
- @FavorMylikes made their first contribution in #1672
- @tomer-grin made their first contribution in #1671
- @Yulv-git made their first contribution in #1675
- @skal65535 made their first contribution in #1668
- @aghand0ur made their first contribution in #1658
- @hrflr made their first contribution in #1655
- @hanseuljun made their first contribution in #1693
- @SomeAlphabetGuy made their first contribution in #1698
- @thomas-graphopti made their first contribution in #1721
- @buesma made their first contribution in #1639
- @ojhernandez made their first contribution in #1747
- @Yzhbuaa made their first contribution in #1642
- @yanxke made their first contribution in #1774
Full Changelog: 3.7...3.8
3.7
What's Changed
- Allow to save fused point cloud in colmap format when using command line by @boitumeloruf in #799
- Fix typos in image.h by @Pascal-So in #936
- Fix for EPnP estimator by @vlarsson in #943
- Visualize models using Python in Open3D by @ahojnnes in #948
- Update tutorial.rst by @ignacio-rocco in #953
- 8 point algorithm internal contraint fix by @mihaidusmanu in #982
- Python script for writing depth/normal arrays by @SBCV in #957
- BuildImageModel: use std::vector instead of numbered arguments by @Pascal-So in #949
- Fix bugs of sift feature matching by @whuaegeanse in #985
- script for modifying fused results by @SBCV in #984
- fix camera model query by @Pascal-So in #997
- fixed small bug in visualize_model.py by @sniklaus in #1007
- Update .travis.yml by @srinivas32 in #989
- Ensure DecomposeHomographyMatrix() always returns rotations by @daithimaco in #1040
- Remove deprecated qt foreach by @UncleGene in #1039
- Fix AMD/Windows GUI visualization bug by @drkoller in #1079
- include colmap_cuda in COLMAP_LIBRARIES when compiled with cuda by @ClementPinard in #1084
- Fix runtime crash when sparsesuite is missing from ceres by @anmatako in #1115
- Store relative poses in two_view_geometry table by @Ahmed-Salama in #1103
- search src images for patch_match from all set, not only referenced subset by @DaniilSNikulin in #1038
- Replace Travis CI with Azure Pipelines for Linux/Mac builds by @ahojnnes in #1119
- Allow ReadPly to handle double precision files by @anmatako in #1131
- Update GPSTransform calculations to improve accuracy by @anmatako in #1132
- Add scale template flag in SimilarityTransform3::Estimate by @anmatako in #1133
- Add CopyFile utility that can copy or hard/soft-link files by @anmatako in #1134
- Expose BA options in IncrementalMapper by @anmatako in #1139
- Allow configurable paths for mvs::Model by @anmatako in #1141
- Change ReconstructionMaanger to write larger recons first by @anmatako in #1137
- Setup Azure pipelines for Windows build by @ahojnnes in #1150
- Add fixed extrinsics in rig config by @anmatako in #1144
- Allow custom config and missing dependencies for patch-match by @anmatako in #1142
- Update print statements for Python 3 compatibility by @UncleGene in #1126
- Allow cleanup of SQLite tables using new database_cleaner command by @anmatako in #1136
- Extend SceneClustering to support non-hierarchical (flat) clusters by @anmatako in #1140
- Support more formats in model_converter by @anmatako in #1147
- Fix Mac 10.15 build due to changed Qt5 path by @ahojnnes in #1157
- Fix bug in ReadCameraRigConfig when reading extrinsics by @anmatako in #1158
- Add utility to compare poses between two sparse models by @ahojnnes in #1159
- Modularize executable main functions into separate sources by @ahojnnes in #1160
- Fix unnecessary copies in for range loops by @ahojnnes in #1162
- Add script to clang-format all source code by @ahojnnes in #1163
- Add back new options and formats for model_converter by @anmatako in #1164
- ImageReder new option and bug fix in GPS priors by @anmatako in #1146
- Parallelize stereo fusion; needs pre-loading of entire workspace by @anmatako in #1148
- Refactoring and new functionality in Reconstruction class by @anmatako in #1169
- Add new functionality in image_undistorter by @anmatako in #1168
- Add new CMake option to disable GUI by @anmatako in #1165
- Fix the memory leak caused by not releasing the memory of the PRNG at the end of the thread by @whuaegeanse in #1170
- Fix fusion segfault bug by @anmatako in #1176
- Update SiftGPU to use floorf for floats by @anmatako in #1182
- fix typo in extraction.cc by @iuk in #1191
- Improvements to NVM, Cam, Recon3D, and Bundler exporters by @drkoller in #1187
- Update model_aligner functionality by @anmatako in #1177
- Add new model_cropper and model_splitter commands by @anmatako in #1179
- use type point2D_t instead of image_t by @iuk in #1199
- Fix radial distortion in Cam format exporter by @drkoller in #1196
- Add new model_transformer command by @anmatako in #1178
- Fix error of using urllib to download eigen from gitlab by @whuaegeanse in #1194
- Multi-line string fix in Python model script by @mihaidusmanu in #1217
- added visibility_sigma to CLI input options for delaunay_mesher. by @Matstah in #1236
- Backwards compatibility of model_aligner by @tsattler in #1240
- [update undistortion] update dumped commands by @hiakru in #1276
- Compute reprojection error in generalized absolute solver by @skydes in #1257
- Modifying scripts/python/flickr_downloader.py to create files with correct extensions by @snavely in #1275
- revise Dockerfile and readme. by @MasahiroOgawa in #1281
- Update to latest vcpkg version by @ahojnnes in #1319
- Fix compiler warnings reported by GCC by @ahojnnes in #1317
- Auto-rotate JPEG images based on EXIF orientation by @ahojnnes in #1318
- Upgrade vcpkg to fix CI build issues by @ahojnnes in #1331
- Added descriptor normalization argument to feature_extractor. by @mihaidusmanu in #1332
- Fix memory leak in the function of StringAppendV by @whuaegeanse in #1337
- Add CUDA_SAFE_CALL to cudaGetDeviceCount. by @chpatrick in #1334
- Add missing include in case CUDA/GUI is not available by @ahojnnes in #1329
- Fix wrong WGS84 model and test cases in GPSTransform by @Freeverc in #1333
- Fixes bug in sprt.cc: num_inliers was not set. by @rmbrualla in #1360
- Prevent a divide by zero corner case. by @rmbrualla in #1361
- Adds missing header. by @rmbrualla in #1362
- Require Qt in COLMAPConfig only if GUI is enabled by @skydes in #1365
- Keep precision in the process of storing in text. by @whuaegeanse in #1363
- Expose exe internals by @skydes in #1366
- Fix inliers matches extraction in EstimateUncalibrated function. by @ferreram in #1369
- Expose exe internals - fix by @skydes in #1368
- Remove deprecated Mac OSX 10.14 image in ADO pipeline by @ahojnnes in #1383
- Add Mac OSX 11 ADO pipeline job by @ahojnnes in #1384
- Fix warnings for latest compiler/libraries by @ahojnnes in #1382
- Fix clang compiler warnings by @ahojnnes in #1387
- Add Address Sanitizer options and fix reported issues by @ahojnnes in #1390
- User/joschonb/asan cleanup by @ahojnnes in #1391
- Add ADO pipeline for Visual Studio 2022 by @ahojnnes in #1392
- Add ccache option by @ahojnnes in #1395
- Update ModelAligner to handle GPS and custom coords. and more by @ferreram in #1371
- Fix camera size change under Windows by @ahojnnes in #1401
- Release of COLMAP version ...
3.6
- Improved robustness and faster incremental reconstruction process
- Add
image_deleter
command to remove images from sparse model - Add
image_filter
command to filter bad registrations from sparse model - Add
point_filtering
command to filter sparse model point clouds - Add
database_merger
command to merge two databases, which is
useful to parallelize matching across different machines - Add
image_undistorter_standalone
to enable undistorting images
without a pre-existing full sparse model - Improved undistortion for fisheye cameras and FOV camera model
- Support for masking input images in feature extraction stage
- Improved HiDPI support in GUI for high-resolution monitors
- Import sparse model when launching GUI from CLI
- Faster CPU-based matching using approximate NN search
- Support for bundle adjustment with fixed extrinsics
- Support for fixing existing images when continuing reconstruction
- Camera model colors in viewer can be customized
- Support for latest GPU architectures in CUDA build
- Support for writing sparse models in Python scripts
- Scripts for building and running COLMAP in Docker
- Many more bug fixes and improvements to code and documentation
Note that with this release, we stop shipping pre-built binaries for CUDA-enabled GPUs with legacy compute capability < 3.0, see https://developer.nvidia.com/cuda-gpus to find out whether your GPU is supported. For older GPU architectures, you can either manually build COLMAP from source using an older CUDA version or download an older COLMAP release.