1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//! Shared correspondence sample types consumed by [`super::Estimator`] impls.
//!
//! These structs are deliberately f64 / column-major-friendly so that the
//! same input slice can flow into the F/E/H trio (two-view) or the PnP path
//! (3D→2D) without copying. Estimators that work in a different precision
//! (e.g. EPnP in f32) convert at the trait boundary.
//!
//! Using owned, named-field structs over tuples follows the project
//! convention for new public APIs and makes the corresponding PyO3 bindings
//! straightforward (`#[pyclass(frozen)]`).
use ;
/// One 2D-2D correspondence between two images.
///
/// Coordinate convention is intentionally not enforced here — most estimators
/// expect *pixel* coordinates and apply Hartley normalization internally
/// (`FundamentalEstimator`, `HomographyEstimator`), while
/// `EssentialEstimator` (5-point) expects already-normalized coordinates
/// (i.e. `K⁻¹ · [x, y, 1]ᵀ`). See each estimator's docs.
///
/// `#[repr(C)]` is load-bearing: the [`crate::ransac::estimators::FundamentalEstimator`]
/// NEON path uses `vld4q_f64` to deinterleave two consecutive matches into
/// SoA lane-vectors in one instruction, which assumes the field order
/// `x1.x, x1.y, x2.x, x2.y` is exactly the in-memory layout.
/// One 3D-2D correspondence (world point ↔ image pixel) for absolute pose
/// estimation (PnP).