Repository navigation
Restore bearing-aware cheirality for DLT triangulation - #2445
Merged
pmoulon merged 1 commit intoNov 7, 2026
Merged
Conversation
Afloat16
marked this pull request as ready for review
October 14, 2026 13:33
Member
|
LGTM |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
TriangulateDLT's rotation/translation overload tests camera-space z for cheirality. Spherical-camera bearings cover the whole sphere, so this rejects valid rear-hemisphere observations and can accept antipodal observations even though the point lies behind an observed ray. This affects callers selecting DIRECT_LINEAR_TRANSFORM.
Check depth along each bearing with x.dot(R * X + t). This retains the transpose removal discussed in #2229. #2332 discussed using Triangulate2View with spherical bearings and closed after the caller corrected their bearings. The native regression uses the actual spherical camera's projection and bearing conversion, with front/rear/mixed hemispheres, rotated and translated cameras, positive bearing scaling, antipodal observations, and subpixel image noise.
Validation: the unchanged upstream triangulation target passes; the new regression fails against baseline with 15 cheirality assertions in one added native case; after the fix, five native CTest executables pass (12 native cases): triangulation, triangulation_nview, solver_essential, Camera_Spherical, and Camera_Pinhole.
Tested with the project's Release CMake build on GCC 14.2.0, bundled Eigen/Ceres, and tests enabled. Rerun, LiGT, examples, software, documentation, GUI, and SoPlex are disabled; Schur specializations are disabled. The configured CTest inventory has 84 executables; the remaining 79 were not run. The full platform/default CI matrix was not run locally.
Prepared with AI assistance and validated using the project's native CMake/CTest targets.