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_priorstable in database in support of pose prior based mapper. - PyCOLMAP API:
align_reconstrution_to_locationsis renamed toalign_reconstruction_to_locations(typo).pycomap.cost_functionsbecomes a module and should be explicitly imported asimport pycolmap.cost_functions.- Replaced
Image.registeredbyImage.{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}. AbsolutePoseErrorCostbecomesAbsolutePosePriorCost.MetricRelativePoseErrorCostbecomesRelativePosePriorCost.- The signature of
ReprojErrorCostand related cost functions was changed: arguments are reordered, the detection uncertainty is now a 2x2 covariance matrix. BundleAdjusterbecomes virtual and should be created withpycolmap.create_default_bundle_adjuster().absolute_pose_estimationbecomesestimate_and_refine_absolute_pose.pose_refinementbecomesrefine_absolute_pose.essential_matrix_estimationbecomesestimate_essential_matrix.fundamental_matrix_estimationbecomesestimate_fundamental_matrix.rig_absolute_pose_estimationbecomesestimate_and_refine_generalized_absolute_pose.homography_matrix_estimationbecomesestimate_homography_matrix.squared_sampson_errorbecomescompute_squared_sampson_error.homography_decompositionbecomespose_from_homography_matrix.Rigid3d.essential_matrixbecomespycolmap.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 #2811
- Install and use newer clang-format from pypi by @ahojnnes in #2812
- Return a reference in Reconstruction.image/camera/point3D by @sarlinpe in #2814
- Add test for PositionPriorErrorCostFunctor. by @ferreram in #2815
- Replace boost/filesystem with standard library by @ahojnnes in #2809
- Fix selection of BA solver type when there is no cuda by @ahojnnes in #2822
- More informative exception if invalid access of image/camera/point3D by @sarlinpe in #2825
- Use minimal solvers from poselib by @ahojnnes in #2288
- Disable -march=native flags in poselib by @ahojnnes in #2828
- Make Image::cam_from_world_ optional by @sarlinpe in #2824
- Remove warning in configure step by @sarlinpe in #2830
- Fix coordinate notation in EstimateAbsolutePose by @ahojnnes in #2833
- Return success status in low-level triangulation functions by @ahojnnes in #2834
- Pin mypy version for tests by @ahojnnes in #2849
- Suppress CMP0167 warning for FindBoost under CMake 3.30 or newer by @ahojnnes in #2853
- Reconstruction reader/writer tests and scene class repr by @ahojnnes in #2842
- Select CUDA device when bundle adjustment uses GPU by @ahojnnes in #2846
- Fix copying behaviors of Reconstruction regarding camera pointers by @B1ueber2y in #2841
- Use the C++ string representation for Python dataclass objects by @sarlinpe in #2855
- Various improvements for pycolmap bindings by @ahojnnes in #2854
- Use analytical Jacobian in IterativeUndistortion. Add trust region by @B1ueber2y in #2857
- Improve the conditioning of covariance estimation by @B1ueber2y in #2860
- Avoid unnecessary copy of RANSAC inlier masks by @ahojnnes in #2863
- Various improvements for cost functors by @ahojnnes in #2867
- Rename
*_mapperto*_pipelinefiles by @ahojnnes in #2870 - Update the manylinux CI to GCC 10 by @sarlinpe in #2873
- Fix rare deadlock during matching due to concurrent database access by @ahojnnes in #2876
- Add new and missing options to automatic reconstructor by @ahojnnes in #2877
- Shared auto diff cost function creation by @ahojnnes in #2878
- Enable model alignment to reference model by @ahojnnes in #2879
- Add covariance weighted cost functor by @ahojnnes in #2880
- Fix unused variable warnings under MSVC by @ahojnnes in #2884
- Skip all but latest Python version in PR builds by @ahojnnes in #2881
- [doc] Fix path to example in README.md by @kielnino in #2886
- Update Github actions versions by @ahojnnes in #2887
- [doc] Fix typo for gui menu item by @kielnino in #2885
- Fix input type for automatic stereo fusion on extreme quality setting by @ahojnnes in #2893
- Make target with all sources optional by @HernandoR in #2889
- Gracefully handle missing image pose in viewer by @ahojnnes in #2894
- Update to latest vcpkg release 2024.10.21 by @ahojnnes in #2908
- Fix conversion from CUDA texture references to objects in SIFT feature extraction by @ahojnnes in #2911
- Modernized bundle adjustment interface by @ahojnnes in #2896
- Add missing unit tests for reconstruction alignment functions by @ahojnnes in #2913
- Do not test EstimateManhattanWorldFrame if LSD is disabled by @sarlinpe in #2920
- Custom macro for enum to string support by @B1ueber2y in #2918
- Bind the estimation of Sim3d by @sarlinpe in #2903
- Initialize glog in custom gmock main function by @ahojnnes in #2916
- Update ccache for faster windows CI builds by @ahojnnes in #2922
- Fixes for Windows ARM64 support by @ahojnnes in #2921
- Move geometry implementation of
__repr__,__eq__overloads to C++ side by @ahojnnes in #2915 - Consistent interface and various improvements for pycolmap/estimators by @ahojnnes in #2923
- Exclude DetectLineSegments if LSD is disabled by @sarlinpe in #2927
- Enable reading 16bit/channel (png) images to grayscale by @Ediolot in #2924
- Cleanup of remaining pycolmap interfaces by @ahojnnes in #2925
- Fix affine SIFT feature orientation detection by @ahojnnes in #2929
- Improvements to deprecated pycolmap members by @sarlinpe in #2932
- Fix pkgconf installation in Mac CI by @ahojnnes in #2936
- Make sphinx show the pycolmap constructors by @sarlinpe in #2935
- Bind synthetic dataset functionality in pycolmap by @ahojnnes in #2938
- Cleaner import of C++ symbols by @sarlinpe in #2933
- Fix pycolmap breakage for Python 3.8 by @sarlinpe in #2941
- Remove legacy boost test macro by @ahojnnes in #2940
- Drop support for VS 2019 CI checks by @ahojnnes in #2943
- Fix CI cache thrashing by inconsistent vcpkg binary caching by @ahojnnes in #2942
- Introduce gmock Eigen matrix matchers by @ahojnnes in #2939
- Prevent double initialization of glog for <=0.5 by @sarlinpe in #2945
- Fixes and refactoring for bundle adjustment covariance estimation by @ahojnnes in #2788
- Fix duplicate library warnings in linking stage by @ahojnnes in #2871
- Add test for Python mapping pipeline by @ahojnnes in #2946
- Add helper script for incremental pycolmap build by @ahojnnes in #2947
- Fix and consistently define Qt window flags by @ahojnnes in #2949
- Cross platform usage of monospace font by @ahojnnes in #2950
- Update to latest pybind11 version by @ahojnnes in #2952
- Update install instructions for Mac using homebrew by @ahojnnes in #2953