ReUseX  0.0.5
3D Point Cloud Processing for Building Reuse
Loading...
Searching...
No Matches
reusex::geometry::detail Namespace Reference

Internals of detect_loop_edges, exposed ONLY so the geometry stages of the pipeline can be regression-tested without a database and without RGB-D fixtures (docs/STANDARDS.md §7; same rationale as plane_factor_consistent_residual() in PlaneGraphOptimizer.cpp). More...

Classes

struct  PanoResection
 One panorama's independent resection against one frame. More...

Functions

std::vector< int > ransac_rigid (const Eigen::Matrix3Xd &src, const Eigen::Matrix3Xd &dst, const LoopClosureOptions &opt, std::mt19937 &rng, Eigen::Matrix4d &best_T)
 RANSAC 3D-3D rigid fit: estimate best_T with dst ~= best_T * src from putative correspondences (both 3xN, column k of src matching column k of dst).
std::vector< LoopEdgepcm_filter (std::vector< LoopEdge > edges, const std::vector< Eigen::Matrix4d > &seed, const LoopClosureOptions &opt)
 Pairwise Consistency Maximization (Mangelson et al.
std::vector< LoopEdgeedges_from_resections (std::vector< PanoResection > resections, const std::vector< Eigen::Matrix4d > &seed_poses, const PanoramaLoopOptions &opt, const LoopClosureOptions &gates, PanoramaLoopResult *stats=nullptr)
 Turn one panorama's per-frame resections into gated loop edges.

Detailed Description

Internals of detect_loop_edges, exposed ONLY so the geometry stages of the pipeline can be regression-tested without a database and without RGB-D fixtures (docs/STANDARDS.md §7; same rationale as plane_factor_consistent_residual() in PlaneGraphOptimizer.cpp).

Internals exposed ONLY so the geometry and gating stages can be regression- tested without a database and without RGB-D fixtures (docs/STANDARDS.md §7; same rationale as LoopClosure's detail namespace).

Not part of the stable API — do not call from application code.

Not a stable API.

Function Documentation

◆ edges_from_resections()

std::vector< LoopEdge > reusex::geometry::detail::edges_from_resections ( std::vector< PanoResection > resections,
const std::vector< Eigen::Matrix4d > & seed_poses,
const PanoramaLoopOptions & opt,
const LoopClosureOptions & gates,
PanoramaLoopResult * stats = nullptr )

Turn one panorama's per-frame resections into gated loop edges.

For each pair (A, B) with A < B by frame index: T_AB = T_pano_A^-1 · T_pano_B, i.e. pose(A)^-1 · pose(B).

Applies, in order: min_frame_gap, the seed-disagreement gates, and the per-panorama cap (highest joint support first, ties broken on (i, j) so the output is deterministic). Sigmas scale with joint inlier support.

stats is accumulated into when non-null (counters are added, not reset), so a caller can sum across panoramas.

◆ pcm_filter()

std::vector< LoopEdge > reusex::geometry::detail::pcm_filter ( std::vector< LoopEdge > edges,
const std::vector< Eigen::Matrix4d > & seed,
const LoopClosureOptions & opt )

Pairwise Consistency Maximization (Mangelson et al.

2018): return the largest mutually consistent subset of edges, where two edges are consistent when chaining them through the seed odometry closes a cycle within opt.pcm_trans_threshold / opt.pcm_rot_threshold. Sets of two or fewer edges are returned unchanged (a pair cannot outvote itself).

◆ ransac_rigid()

std::vector< int > reusex::geometry::detail::ransac_rigid ( const Eigen::Matrix3Xd & src,
const Eigen::Matrix3Xd & dst,
const LoopClosureOptions & opt,
std::mt19937 & rng,
Eigen::Matrix4d & best_T )

RANSAC 3D-3D rigid fit: estimate best_T with dst ~= best_T * src from putative correspondences (both 3xN, column k of src matching column k of dst).

Uses opt.ransac_iterations hypotheses and opt.ransac_inlier_dist as the inlier distance, refits on the full inlier set, and returns the inlier column indices (empty when fewer than 3 correspondences are given or no hypothesis was finite).