A new crate holding the CPU half of a merge (FR-MRG-10): the grayscale proxy with orientation, the XFeat decoder ported step for step from the reference detectAndCompute, mutual-nearest-neighbour matching, a robust pairwise homography with the focal length read off it, a hand-rolled Levenberg–Marquardt bundle adjustment over every rotation and the focal, the three output projections, and align(), which chains it all and names the frames it could not place rather than guessing (FR-MRG-5). Dependency-free without the xfeat feature — linalg.rs says why the dense algebra is hand-rolled — and tested on synthetic sweeps whose answer is known exactly. The noise test records the single-row degeneracy: one pixel of noise is a tenth of a percent of focal, which is a uniform stretch of the sweep, not a misalignment.
38 lines
1.3 KiB
TOML
38 lines
1.3 KiB
TOML
[package]
|
|
name = "dr-pano"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
rust-version.workspace = true
|
|
license.workspace = true
|
|
# Guards against a Git LFS pointer being embedded in place of the weights.
|
|
build = "build.rs"
|
|
|
|
[dependencies]
|
|
thiserror.workspace = true
|
|
log.workspace = true
|
|
|
|
# Inference for the learned keypoint detector, on the same footing as
|
|
# `dr-segment`: `ort` is the API, tract is the engine, and both are optional
|
|
# so that the geometry — matching, the rotation solve, the projections — is a
|
|
# dependency-free crate that tests without a model.
|
|
ort = { workspace = true, optional = true }
|
|
ort-tract = { workspace = true, optional = true }
|
|
ndarray = { workspace = true, optional = true }
|
|
|
|
[dev-dependencies]
|
|
# The example aligns real frames from their embedded previews.
|
|
dr-decode.workspace = true
|
|
dr-types.workspace = true
|
|
env_logger.workspace = true
|
|
|
|
[features]
|
|
default = ["xfeat", "embedded-model"]
|
|
|
|
# The XFeat detector (FR-MRG-8). Off, the crate has no model and no runtime,
|
|
# and `Detector` has no implementation — a build that only wants the geometry.
|
|
xfeat = ["dep:ort", "dep:ort-tract", "dep:ndarray"]
|
|
|
|
# Compile the weights into the binary, for the same reason `dr-segment` does:
|
|
# Android hands the app no path to read a model from (ARCH §6.9).
|
|
embedded-model = ["xfeat"]
|