Releases: colmap/colmap
Releases · colmap/colmap
4.0.4
4.0.3
Bug Fixes
- Fix various issues in incremental mapper's reg_stats bookkepping
- Fix reading of dynamic matrices in SQLite3 database
- Fix optional access in guided matching
- Fix conditional Eigen alignment for 3.4.0 pre-release version
- Fix ceres::GradientChecker constructor for older Ceres versions
- Fix for pycolmap installation related to ONNX
- Fix bug where num_reg_images was not cleared
- Fix mask usage log never printing in feature writer thread
- Fix undefined behavior in PoissonRecon
- Fix locale-dependent float parsing/formatting
- Fix empty PatchMatch results on Blackwell GPUs (sm_100+)
- Fix pyceres .problem attribute on CeresBundleAdjuster returned by factory functions
- Fix missing rotation averaging options to global mapper
- Fix piping of bundle adjustment options in global mapper
Improvements
- Handle CHOLMOD includes not being in a subdirectory
- Use non-deprecated SQLite3::SQLite3 CMake target
- Reduce thread oversubscription in hierarchical mapper
4.0.2
4.0.1
4.0.0
New Features
- Integrated GLOMAP global SfM pipeline into COLMAP as a first-class alternative
to the incremental/hierarchical mappers, available via theglobal_mapperand
automatic_reconstructor --mapper GLOBALcommands. Many fixes and improvements
have been applied to the GLOMAP codebase as part of this migration.
GLOMAP is maintained through the COLMAP repository going forward.
The global pipeline uses view graph calibration to estimate
intrinsics from two-view geometries, which may produce different camera
parameters compared to the incremental pipeline's self-calibration. - Added ALIKED (N16Rot/N32) feature extraction through ONNX support. Support for brute-force
and LightGlue matching as well as scalable matching with pre-trained vocabulary trees. - Added LightGlue ONNX feature matching for SIFT and ALIKED.
- Added Python bindings for feature extractor and matcher.
- Added support for reading image orientation from EXIF and auto-rotating images
during feature extraction/matching for better robustness against rotational viewpoint changes. - Added structure-less image registration fallback using generalized
relative pose estimator for registering images without 3-view overlap. - Added division camera models (SIMPLE_DIVISION, DIVISION).
- Added fisheye camera model without distortion parameters (FISHEYE).
- Improved Ceres bundle adjustment performance by ~10% through single pose parameter block.
- Improved Ceres bundle adjustment performance by ~15% for SIMPLE_RADIAL camera model
and trivial frames through analytical Jacobians. - Added abstract general bundle adjuster and solver summary in preparation for
supporting different optimization backends. - Replaced FreeImage with OpenImageIO for ~2.5x faster image I/O, support for more
image formats, and using an actively maintained dependency with security fixes, etc. - Added guided geometric verification using a known reconstruction.
- Added view graph calibration as a new module.
- Added model clustering to partition large reconstructions into
smaller, manageable sub-models based on scene connectivity. - Added mesh simplification using Quadric Error Metric (QEM) decimation.
- Added mesh texture mapping for producing textured meshes from calibrated images.
- Added option to specify JPEG quality during image undistortion.
- Added support for loading bitmaps with alpha channel.
- Added option to control refinement of 3D points in bundle adjuster.
- Added optional support for position prior in absolute pose refinement.
- Added supernodal CHOLMOD L1 solver support.
- Added multi-threading support for (LO)RANSAC loop.
- Added support for custom SSL certificate locations through
SSL_CERT_FILE and SSL_CERT_DIR environment variables. - Added support for static Windows builds with CUDA.
- Exposed
pycolmap.match_from_pairsfor custom pair matching on GPU. - Added Python bindings for depth and normal maps.
- Added Python type checking (mypy) for all code.
- Improved incremental mapper and triangulator Python bindings.
- Added support for visualizing (textured) meshes in the GUI.
- Added drag-and-drop folder support for model import in the GUI.
- Added drag-and-drop support for PLY import in the GUI.
- Switched to native menu bar in GUI on macOS.
- Added support for building shared libraries.
- Improved patch match stereo performance by reading inputs in parallel.
- Reduced model viewer memory usage in the GUI.
- Added automatic fallback to BA CPU solver if GPU solver fails.
- For other minor improvements, see full list of changes below.
Bug Fixes
- Fixed guided matching for calibrated non-linear cameras.
- Fixed database race conditions in mapping pipelines.
- Fixed MSVC compatibility with
isnan. - Fixed undefined behavior in feature match swapping.
- Fixed SVD computation in affine transform.
- Fixed 2D association issue at
AddPoint3Dwithpoint3D_id. - Fixed several issues in database merging.
- Fixed MVS workspace image downsizing.
- Fixed pycolmap to respect
fix_existing_framesoption in the incremental pipeline. - Fixed transcription of image IDs in reconstruction from database.
- Fixed
BundleAdjustmentConfig::NumResidualsignoring point statistics. - Fixed incorrect propagation of incremental options in automatic reconstructor.
- Fixed triangulation angle computation in patch match sampling.
- Fixed inverted units in
ExifFocalLengthmetadata extraction. - Fixed slow performance of generalized absolute pose estimator verification.
- Propagate exceptions from
ThreadPool::Wait. - Fixed empty patch match results on CUDA compute >= 100 (Blackwell GPUs).
- Fixed
filter_frames_usage inFindNextImages. - Fixed
model_alignercrash by using new pose prior API. - For other bug fixes, see full list of changes below.
Breaking Changes
- Replaced FreeImage with OpenImageIO for image I/O. There may be slight differences
in terms of supported image formats and loaded pixel values. - Dropped support for Python 3.9 due to EOL.
TwoViewGeometryfieldscam2_from_cam1,E,F,Hare nowstd::optional.Rigid3dandSim3dparameters stored as single vector.
Userotation()andtranslation()accessor methods instead of direct member access.- Bundle adjustment cost functors use single pose parameter blocks.
BundleAdjusternow returnsstd::shared_ptr<BundleAdjusterSummary>instead ofceres::SolverSummary.- Ceres-related CLI options are prefixed with
BundleAdjustmentCeres.*. - GPS/ENU coordinate conversion functionality cleaned up, breaking the Python interface.
- Feature descriptors are now associated with a type that is propagated through
the pipeline and storage. Fails matching if descriptor types are inconsistent. - Pose priors associated with generic sensor measurement data.
DatabaseCacheinitialization consolidated into a single options struct
instead of scattered arguments.- Switched paths from
std::stringtostd::filesystem::paththroughout
the C++ codebase. Pythonpathlib.Pathobjects are now automatically
converted. No breaking impact on the Python interface.
Full Change List (sorted temporally)
- Fix MSVC compatibility with
isnanby @nharbiso in #3720 - Include v3.13 to legacy dropdown. by @B1ueber2y in #3724
- (bugfix) initializing added_two_view_geometry_options_ to false by @AlePuglisi in #3727
- Update the tag of the doc submodule to the latest commit. by @B1ueber2y in #3729
- Fix duplicated parameters for pycolmap.extract_features and fix pycolmap README. by @B1ueber2y in #3728
- Document how to speed up bundle adjustment by @StonerLing in #3730
- Fix reconstruction benchmark by @ahojnnes in #3731
- Remove doc submodule for easier maintenance. by @B1ueber2y in #3732
- Fix undefined behavior in feature match swapping by @ahojnnes in #3733
- Fix SVD computation in affine transform by @ahojnnes in #3734
- Fix random seed stability tests for incremental mapper by @ahojnnes in #3735
- Structure-less image registration using generalized relative pose estimator by @ahojnnes in #2829
- Add supernodal cholmod L1 solver support and more tests by @ahojnnes in #3737
- Add union-find implementation by @ahojnnes in #3738
- Add unit tests for base controller by @ahojnnes in #3739
- Add unit tests for PLY utils by @ahojnnes in #3742
- Inline SQLite3 utils in database implementation by @ahojnnes in #3741
- Allow reuse of cholesky decomposition in L1 solver by @ahojnnes in #3743
- Add unit tests for controller thread by @ahojnnes in #3740
- Add drag-and-drop folder support for model import in the GUI by @StonerLing in #3744
- Update to latest vcpkg by @ahojnnes in #3745
- Include instructions to update documentation after new releases by @chipironcin in #3716
- Remove unused CMake warning level variable by @ahojnnes in #3747
- Import of GLOMAP source code by @ahojnnes in #3748
- Correct the spelling of GeometricVerifier. by @B1ueber2y in #3749
- Update Windows ccache to 4.12.1 by @ahojnnes in #3750
- Remove custom glomap constants by @ahojnnes in #3751
- Remove unnecessary glomap Camera by @ahojnnes in #3753
- Misc code quality improvements for max spanning tree by @ahojnnes in #3755
- Configure clang-format for glomap code by @ahojnnes in #3756
- Support two view geometry with empty inlier matches in the database. by @B1ueber2y in #3754
- Modularize glomap libraries by @ahojnnes in #3757
- Use colmap reconstruction matchers in global mapper tests by @ahojnnes in #3758
- Fix WriteTwoViewGeometry when inlier matches are empty. by @B1ueber2y in https://github.com/colmap/co...
3.13.0
New Features
- Improved human-readable consistency checks when configuring a
reconstruction with rigs, cameras, frames, and images. - Improved multi-GPU feature extraction & matching performance by avoiding global mutex.
- Improved robustness of pose prior mapper against outlier priors.
- Improved the performance of reconstruction initialization through parallelization.
- Added CUDA-enabled pycolmap package for Linux and automatic publishing to PyPI.
- Make the reconstruction process fully deterministic with a new random_seed parameter.
- Added support for filtering stationary points in two-view geometry estimation.
- Added option to perform geometric verification with rig constraints.
- Added option to skip matching for image pairs within the same frame.
- Added option to keep specific cameras or rigs constant during the reconstruction.
- Added option to clean two-view geometries in database_cleaner.
- Added option to specify timeout for incremental mapper.
- Added an abstract database interface for easier integration with other database backends.
- Added experimental support for feature sub-selection for global BA.
- Added testing tools for synthetic reconstruction noise and image generation.
- Added official support for Python 3.14.
- Added support for Qt6 while still fully supporting Qt5.
Bug Fixes
- Fixed various issues with new rig support.
- Fixed rare deadlocks in feature matching.
- Support for UTF-8 database paths in Windows.
- Fixed bundle adjustment performance regression due to changed Gauge behavior.
- Removed custom manifold from colmap to avoid issues with pyceres.
- Fixed rare crash of GUI when clearing the model viewer.
- Fixed focal length extraction from 35mm equivalent EXIF information.
- Fixed coordinate bug in ComputeEqualPartsBboxes.
Breaking Changes
- Dropped official support for Python 3.8.
- Dropped official support for MacOS x86.
- Upgraded to pybind11 3.X.
- Removed deprecated rig bundle adjuster command in favor of rig configurator and
default bundle adjuster supporting the same functionality. - Allow one-to-many matches in correspondence graph. Previously, only one-to-one matches were added
to the correspondence graph and therefore other matches were not used during reconstruction.
Full Change List (sorted temporally)
- Autoselect compatible nvidia for docker by @MasahiroOgawa in #3454
- Add 3.12.1 changelog to main by @ahojnnes in #3461
- Add min_num_neighbors constraint for spatial matching by @StonerLing in #3463
- Refactor feature extraction/matching to support other features by @ahojnnes in #3465
- Define VisualIndex::Read as static in python bindings by @ahojnnes in #3467
- Only find C/CXX OpenMP components by @ahojnnes in #3469
- Remove unnecessary GPU checks in pycolmap by @sarlinpe in #3472
- Fix a bug affecting feature matching on GPU by @sarlinpe in #3473
- Add command line option for
TwoViewGeometry.detect_watermarkby @gareth-cross in #3476 - Add and test GetRelativePath by @sarlinpe in #3475
- Update GetPathBaseName to rely on std::filesystem by @sarlinpe in #3481
- Fix potential deadlock in job queue by @huluoboge in #3480
- Update FindMetis.cmake to also link GK_LIBRARIES by @yeicor in #3470
- Remove check in database_cache.cc that breaks backwards compatibility with image_list_file_path by @pd-karoly-harsanyi in #3478
- Fix docker run script for GUI by @MasahiroOgawa in #3483
- Ensure UTF-8 encoding for database paths passed to SQLite open by @StonerLing in #3482
- Add changelog for 3.12.2 release by @ahojnnes in #3488
- Add changelog for 3.12.3 release by @ahojnnes in #3490
- Fix BundleAdjustmentConfig::SetConstantRigFromWorldPose by @whuaegeanse in #3501
- Add random_seed option to RANSACOptions for reproducible TwoViewGeometry estimation by @StonerLing in #3492
- Configure trivial rigs for unconfigured images by @ahojnnes in #3497
- Fix pycolmap test command by @ahojnnes in #3506
- Pano SFM example improvements and fixes by @ahojnnes in #3503
- Support Python 3.14 and retire 3.8 by @ahojnnes in #3518
- Upgrade ruff and automatically apply fixes by @ahojnnes in #3515
- Update point3D errors after bundle adjustment or SfM by @whuaegeanse in #3500
- Add option to filter stationary points in two-view geometry estimation by @ahojnnes in #3521
- Add unit test for watermark detection by @ahojnnes in #3524
- Fix comment for FilterStationaryMatches by @sarlinpe in #3525
- Ignore compile_commands.json in git by @ahojnnes in #3526
- Fix bundle adjustment performance regression due to changed Gauge by @ahojnnes in #3527
- Bind CUDA utils in pycolmap by @ahojnnes in #3532
- Add explicit tests for fixing gauge freedom and bugfix by @ahojnnes in #3533
- Fix format specifier overflow in WriteSnapshot() timestamp by @StonerLing in #3534
- Change input in cost function to log scale and remove custom manifold from colmap. by @B1ueber2y in #3538
- Throw exception when image.SetFramePtr() sets a frame without the image listed as its data. by @B1ueber2y in #3540
- Avoid frame having data from a sensor that does not exist in its associated rig. by @B1ueber2y in #3543
- Revert scale changes for metric reconstruction in rig sfm. by @B1ueber2y in #3530
- Fix comment for C++20 support. by @B1ueber2y in #3547
- Clean up unused includes in scene folder by @ahojnnes in #3548
- Add random_seed to IncrementalMapper to control all RANSAC seeds for improved SfM reproducibility by @StonerLing in #3544
- Throw exception at counting registered images when an image in the frame does not exist in the reconstruction. by @B1ueber2y in #3546
- Clean up unused includes in retrieval folder by @ahojnnes in #3549
- Clean up unused includes in optim folder by @ahojnnes in #3550
- Fix ModelViewerWidget::ClearReconstruction by @whuaegeanse in #3552
- Fix build with Boost 1.89.0 by @cho-m in #3553
- Clean up unused includes in util folder by @ahojnnes in #3551
- Retire Mac x86 support by @ahojnnes in #3555
- Update database bindings by @ahojnnes in #3556
- Throw exception for Frame::SetRigId when rig pointer is available. by @B1ueber2y in #3558
- Fix rig configuration with differing IDs between database and reconstruction by @ahojnnes in #3557
- Removing the Global Lock in SiftGPUFeatureMatcher for CUDA backend by @yimingc in #3561
- Add option to skip matching for image pairs in same frame by @ahojnnes in #3563
- Add option to keep specific cameras constant by @ahojnnes in #3565
- Throw exception if any camera in the rig does not exist in the reconstruction. by @B1ueber2y in #3564
- Clean up unused includes in controllers folder by @ahojnnes in #3566
- Extract image pair conversion functions into type utils by @ahojnnes in #3568
- Clean up unused includes in estimators folder by @ahojnnes in #3567
- Expect error threshold for generalized relative pose in pixel space by @ahojnnes in #3571
- Add function to read number of matches by @ahojnnes in #3572
- Add a test to ensure THROW_CHECK conditions are evaluated exactly once by @ahojnnes in #3573
- Simplify and reuse feature matcher thread creation by @ahojnnes in #3575
- Increase exhaustive matching cache size by @ahojnnes in #3576
- Add option to clean two-view geometries by @ahojnnes in #3577
- Decouple feature matching and two-view geometry options by @ahojnnes in #3578
- Display CLI floating-point defaults with 3 significant digits by @StonerLing in #3579
- Make...
3.12.6
Improvements
- Upgrade to pybind 3.0.1 and use smart holder for all classes.
- Support both Qt5 and Qt6.
- Ensure download support on Ubuntu by installing libssl-dev for crypto.
- Add bindings for mvs::model for covisibility support in pycolmap.
- Add missing rig and frame interfaces for pycolmap database.
- Throw exception when the rig configurations of the database and existing reconstruction are inconsistent.
- Improve the Gauge logic for fixing two views.
Bug Fixes
- Fix focal length extraction from 35mm equivalent.
- Fix inconsistent pycolmap naming for RegisterFrame and DeRegisterFrame.
- Call Retriangulate irrespective of the logging level.
- Fix bundle adjustment with constant rig from world pose.
3.12.5
Improvements
- Add various safety checks with more understandable error messages
when adding misconfigured rigs/cameras/frames/images to the reconstruction. - Recover original metric reconstruction scale in case of configured rigs.
Bug Fixes
- Fix incompatibilities due to redundant symbol definition in pycolmap/pyceres.
- Fix error threshold for generalized relative pose to be in pixel space.
- Fix rig configuration in case of inconsistent IDs in database/reconstruction.
- Fix missing colmap namespace in sqlite3 macro.
- Fix CMake configuration with Boost 1.89 or newer.
- Fix viewer crash when clearing the reconstruction.