Skip to content

Extract ConvertPosePriorsToENU and skip pose priors without position - #4937

Merged
sarlinpe merged 1 commit into
mainfrom
sarlinpe/pose-prior-enu-conversion
Nov 3, 2026
Merged

sarlinpe merged 1 commit into
mainfrom
sarlinpe/pose-prior-enu-conversion

Conversation

@sarlinpe

@sarlinpe sarlinpe commented Oct 31, 2026 •

Copy link
Copy Markdown
Member

Problem

During feature extraction (ImageReader::Next), COLMAP writes a PosePrior with gravity from EXIF orientation and coordinate_system = UNDEFINED (position = NaN) even when an image has no GPS tag. If other images in the same database have GPS tags (coordinate_system = WGS84), DatabaseCache::ConvertPosePriorsToENU() and colmap model_aligner --database_path fail on THROW_CHECK or feed NaN positions into GPSTransform. In addition, the ENU conversion lived privately inside DatabaseCache, so standalone bundle adjustment callers reading PosePriors from a database could not reuse it.

Fix

  • Extract void ConvertPosePriorsToENU(std::vector<PosePrior>& pose_priors) into colmap/geometry/pose_prior.{h,cc} and call it from DatabaseCache::Create and DatabaseCache::CreateFromCache.
  • Skip !pose_prior.HasPosition() entries in ConvertPosePriorsToENU and in ReadDatabaseCameraLocations (src/colmap/exe/model.cc) so gravity-only PosePrior records are ignored by position-prior conversion and model_aligner.

Tests

  • Added PosePrior.ConvertPosePriorsToENU in src/colmap/geometry/pose_prior_test.cc covering empty inputs, Cartesian/gravity-only no-ops, mixed gravity-only + WGS84 priors, and inconsistent coordinate systems with valid positions.
  • Added mixed gravity-only + WGS84 test coverage in src/colmap/scene/database_cache_test.cc.

Stack created with GitHub Stacks CLI • Give Feedback 💬

@sarlinpe
sarlinpe added this pull request to stack #4941 October 31, 2026 23:13
@sarlinpe
sarlinpe force-pushed the sarlinpe/pose-prior-enu-conversion branch from 04dae02 to 2525bf3 Compare November 1, 2026 23:06
@sarlinpe
sarlinpe removed this pull request from stack #4941 November 1, 2026 23:10
@sarlinpe
sarlinpe added this pull request to stack #4948 November 1, 2026 23:10
@sarlinpe
sarlinpe force-pushed the sarlinpe/pose-prior-enu-conversion branch from 2525bf3 to dcfe30b Compare November 3, 2026 00:30
Base automatically changed from sarlinpe/ba-prior-loss-scale to main November 3, 2026 13:48
@sarlinpe
sarlinpe force-pushed the sarlinpe/pose-prior-enu-conversion branch from dcfe30b to 6a972d9 Compare November 3, 2026 13:48
@sarlinpe
sarlinpe requested a review from ahojnnes November 3, 2026 16:39
@sarlinpe
sarlinpe marked this pull request as ready for review November 3, 2026 16:39
@sarlinpe sarlinpe added the full-ci Run Windows and remaining pycolmap CI label Nov 3, 2026
@sarlinpe
sarlinpe merged commit 3db6eb0 into main Nov 3, 2026
21 checks passed
@sarlinpe
sarlinpe deleted the sarlinpe/pose-prior-enu-conversion branch November 3, 2026 22:53
fringehush-gif added a commit to fringehush-gif/colmap that referenced this pull request Nov 4, 2026
## Change

Integrate the shared geometry owner for WGS84-to-ENU pose-prior conversion.
Skip priors without finite positions while preserving gravity-only records,
and avoid indexing empty camera-location inputs in model alignment.

## Upstream commits

- 3db6eb0 Extract ConvertPosePriorsToENU and skip pose priors without position (colmap#4937)

## Validation

Clean automatic merge; all seven incoming files match the upstream parent.
Linux GCC 12.4: PosePrior 6/6 and DatabaseCache 10/10 tests passed, including
the position-free and mixed gravity/GPS conversion regressions. The affected
model.cc CLI object compiled. Five configured clang-tidy units exited
successfully with no emitted diagnostics.

Windows 10, Haswell i7-4790K, MSVC 19.39: the same 16 tests passed without
failures or skips, and the actual model.cc object compiled. Both hosts built
the affected header-dependent consumers and two fresh archives before linking
the test executables. The CLI was neither linked nor run; no CUDA execution,
reconstruction or performance claim is made.

## AI disclosure

Upstream authorship is preserved. Integration and validation are AI-assisted.
fringehush-gif added a commit to fringehush-gif/colmap that referenced this pull request Nov 4, 2026
## Change

Integrate the shared geometry owner for WGS84-to-ENU pose-prior conversion.
Skip priors without finite positions while preserving gravity-only records,
and avoid indexing empty camera-location inputs in model alignment.

## Upstream commits

- 3db6eb0 Extract ConvertPosePriorsToENU and skip pose priors without position (colmap#4937)

## Validation

Clean automatic merge; all seven incoming files match the upstream parent.
Linux GCC 12.4: PosePrior 6/6 and DatabaseCache 10/10 tests passed, including
the position-free and mixed gravity/GPS conversion regressions. The affected
model.cc CLI object compiled. Five configured clang-tidy units exited
successfully with no emitted diagnostics.

Windows 10, Haswell i7-4790K, MSVC 19.39: the same 16 tests passed without
failures or skips, and the actual model.cc object compiled. Both hosts built
the affected header-dependent consumers and two fresh archives before linking
the test executables. The CLI was neither linked nor run; no CUDA execution,
reconstruction or performance claim is made.

## AI disclosure

Upstream authorship is preserved. Integration and validation are AI-assisted.
fringehush-gif added a commit to fringehush-gif/colmap that referenced this pull request Nov 7, 2026
Refresh the experimental alternative with fork main while retaining its previous head as a parent. The resulting tree is exactly main plus the isolated shared-current-cost-cache deletion: one CUDA file, +1/-25.

## Change

Read the existing cost map directly during the ordered sampled-cost fold. Preserve current plane propagation, source packing, scheduling and fallback mathematics. The cache originates in custom a37c1c3, MVS: Reuse sampled current costs (GPU perf). The earlier alternative is retained through 8481f89; its original experiment was 8b1412f.

Historical Fountain11 photo+geometry at 3072 recorded 76.85 -> 78.82 seconds, one observation per arm, on the older revision. Retain this inconclusive/adverse observation with its earlier revision; current performance has not been measured. No performance experiment was reopened.

## Validation

- Exact candidate CUDA owner compiled with CUDA 13.2 for compute_86/sm_86. In a bounded retained-support context on RTX 3060, both matched targets passed all 13 selected cases: propagation, ordered source folding, checkpoint-HMM and paired-sweep preservation.
- Four complete inputs and four outputs matched across executables: 8,492,128 bytes per arm. Maps were finite with positive depth and checked ordered graph IDs. Complete witnesses use checkpoint_hmm=false; separate checkpoint tests cover both settings without full cross-executable true-mode witnesses.
- Direct owners, link maps and actual loaded providers were checked; managed jobs ended and released their bookings. Later host resize/warp changes have separate owner qualification. This is not a whole-branch build, reconstruction-quality, portability or current-performance result.

## Upstream commits carried forward

- e52aa8e Move pycolmap macOS CI from macos-14 to macos-15 runner (colmap#4933)
- 8007d1a Preserve float weight ordering in maximum spanning trees (colmap#4928)
- dd84102 Bump pypa/gh-action-pypi-publish from 1.14.2 to 1.14.3 in /.github/workflows (colmap#4942)
- 721e185 Add FlexGlue feature matcher (colmap#4908)
- d0a411f FlexGlue: cache the dense features on the GPU (colmap#4915)
- 105817b Hoist camera model dispatch per row in image warps (colmap#4935)
- 27ffad4 Make benchmark translation-angle errors invariant to reconstruction scale (colmap#4932)
- e8f3522 Resolve benchmark paths before changing subprocess directories (colmap#4931)
- f664d5d Clamp visibility coordinates before unsigned conversion (colmap#4943)
- 138119b Keep thin bitmap thumbnails nonempty (colmap#4927)
- b16ed5f Count rig frame covisibility once per 3D point (colmap#4893)
- 93dbbcb Add colmap-review agent skill for code review (colmap#4934)
- 2a6f695 Fix sift_test build on MSVC without the GUI (colmap#4955)
- 78cc729 Fix default prior_position_loss_scale to sqrt(chi2_95_3dof) (colmap#4936)
- 8653c6b Estimate two-view relative rotation covariance (colmap#4950)
- e1317dd FlexGlue: match keypoints in the resized descriptor input frame (colmap#4949)
- 3db6eb0 Extract ConvertPosePriorsToENU and skip pose priors without position (colmap#4937)
- 77cbe48 Store and estimate rotation covariances on PoseGraph (colmap#4951)
- 30a1a81 Support covariance whitening in CeresRotationAverager (colmap#4952)
- e6644e7 Fix -Wunused-result warning in ThreadPool::AddTask (colmap#4958)
- 5b6da88 Clear descriptor-index results for empty queries (colmap#4960)
- d1d92d9 Add COVARIANCE reweighting for Ceres rotation averaging (colmap#4953)
- 761d90d Enable covariance-weighted rotation averaging in global pipelines (colmap#4823)
- fdee2e1 Reuse the pose graph of GlobalPipeline in the component mappers (colmap#4912)

AI disclosure: Totally vibe coded
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

full-ci Run Windows and remaining pycolmap CI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants