Skip to content

Rescale keypoint shapes in image coordinates - #4926

Merged
ahojnnes merged 3 commits into
colmap:mainfrom
aswanth-07:fix/keypoint-image-rescaling
Oct 30, 2026
Merged

ahojnnes merged 3 commits into
colmap:mainfrom
aswanth-07:fix/keypoint-image-rescaling

Conversation

@aswanth-07

Copy link
Copy Markdown
Contributor

FeatureKeypoint::Rescale(scale_x, scale_y) rescales a keypoint's location in image coordinates but scales the columns of its affine shape. A rotated or sheared feature then describes a different image region after unequal x/y resizing. The feature-extraction controller uses this method to restore keypoints from resized bitmaps, including slightly different width/height ratios after rounding.

Scale the shape's rows instead. Both entries contributing to image x use scale_x, and both contributing to image y use scale_y. This follows the bundled VLFeat frame convention: a local patch point maps to A * point + center, so resizing the image gives S * A * point + S * center.

Uniform resizing, axis-aligned frames, descriptor data and stored formats stay unchanged. The fix exchanges two multiply operands and adds no allocation or option.

Validation:

  • The new native regression fails on pristine main in all nine orientation/scale combinations and passes patched. It includes ordinary rounded image-resize ratios.
  • All nine native feature-types tests pass with MSVC Release. The existing anisotropic shape assertions now follow the same image-coordinate formula.
  • 3,000 independent frame-transform checks pass; 2,000 uniform and axis-aligned controls preserve exact base/patch values.
  • Clang-format 23.1.3 and git diff --check pass. Local Clang-Tidy 23.1.3 reports the same five unchanged-header diagnostics on base and patch, with no finding in the changed method.

I did not run the full feature-extraction/application pipeline, a dataset reconstruction, GPU build or other operating systems locally.

AI assistance disclosure: AI-assisted development tools were used during investigation and implementation. The reported tests were run against the final diff.

@aswanth-07
aswanth-07 marked this pull request as ready for review October 30, 2026 04:26
- Document in types.h that the affine shape transforms as
  diag(scale_x, scale_y) * A, i.e. its rows are scaled.
- Use a larger probe point (2, 2) in RescaleImageCoordinates so the
  rounded-ratio case discriminates the old implementation.
- Use EXPECT_THAT with EigenMatrixNear(expected, 1e-6) instead of
  comparing the difference norm directly.
@ahojnnes
ahojnnes enabled auto-merge (squash) October 30, 2026 10:48
@ahojnnes ahojnnes added the full-ci Run Windows and remaining pycolmap CI label Oct 30, 2026
@ahojnnes
ahojnnes merged commit 4afe8d1 into colmap:main Oct 30, 2026
21 checks passed
fringehush-gif added a commit to fringehush-gif/colmap that referenced this pull request Nov 3, 2026
## Summary
- Integrate all 12 upstream commits after the shared base 9371f7b, including LoMa BF16 loading, matching-worker error propagation, keypoint shape scaling, and project-file CLI overrides.
- Preserve the fork's CUDA blocking-sync helper alongside upstream's BF16 device check and register the shared CUDA test once.

## Validation
- Resolved all merge conflicts; no conflict markers or unmerged paths remain; git diff --check passes.
- Incremental Linux CUDA build linked six focused test executables. The prepared custom Ceres closure required its existing Abseil/CUDA library directories on the linker's search path.
- CTest passed controllers/base_option_manager_test, feature_matching_utils_test, incremental_pipeline_test, option_manager_test, feature/loma_test, and util/cuda_test (six programs, one run each).
- No full suite, Python binding, end-to-end, or performance claim.

## Upstream commits

- `ea470c0c4f4a40a3bdfa33d01eb38375c5df64de` Run Windows and remaining pycolmap CI only with the full-ci label (colmap#4904)
- `c0339e95482c404b51f38ff9b86866de495984f0` Fix MSVC warnings C4805, C4996, and C4756 (colmap#4910)
- `f00d6063bb0b120cf10ee190f7f06f4a34edf432` Expose Ceres solver thresholds in incremental mapping (colmap#4892)
- `978a4467f36bbfc9ae18780f2dca253000b0d008` Keep division-camera derivatives finite on the optical axis (colmap#4888)
- `98f31541f483788ab550f5c4a4e0804e8674b9e0` Fix leak and check covariance in CovarianceWeightedCostFunction (colmap#4911)
- `a467519441171054c7aaa17dffe86fe06431f05c` Avoid stack overflow when compressing union-find chains (colmap#4906)
- `404b83db2c2cc04892e14a578ddfa73e0ac9bfb1` Fix LoMa bf16 fallback on CUDA by loading it like any other model (colmap#4924)
- `d02e6701dede22eaeee89f73784a8c79f6f289ac` Add max_num_features option to automatic_reconstructor and benchmark (colmap#4907)
- `82c3b5db78d96a7e93ca7b8b2af0634e28aa33f4` Propagate errors of feature matching workers instead of terminating (colmap#4921)
- `4afe8d1156a71a2ff33974895f221c8eb3740cb1` Rescale keypoint shapes in image coordinates (colmap#4926)
- `ce2b5ab9df3801c2b75edbba338c04ad3c8cc6af` Fix vocabulary tree builder descriptor dimensions (colmap#4923)
- `f956ce629c21a88d75a7f7b3107298d1faf3dcf3` Fix command-line overrides for project files (colmap#4902)
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