#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ScoringType {
Ransac,
Msac,
Magsac,
Minpran,
Acransac,
Gau,
Ml,
Grid,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SamplerType {
Uniform,
Prosac,
Napsac,
ProgressiveNapsac,
ImportanceSampler,
ArSampler,
Exhaustive,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NeighborhoodType {
Grid,
BruteForce,
FlannKnn,
FlannRadius,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LocalOptimizationType {
None,
Lsq,
Irls,
NestedRansac,
GcRansac,
IteratedLmeds,
CrossValidation,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TerminationType {
Ransac,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum InlierSelectorType {
None,
SpacePartitioningRansac,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ArSamplerSettings {
pub estimator_variance: f64,
pub randomness: f64,
}
impl Default for ArSamplerSettings {
fn default() -> Self {
Self {
estimator_variance: 0.9765,
randomness: 0.01,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct LocalOptimizationSettings {
pub max_iterations: usize,
pub graph_cut_number: usize,
pub sample_size_multiplier: f64,
pub spatial_coherence_weight: f64,
}
impl Default for LocalOptimizationSettings {
fn default() -> Self {
Self {
max_iterations: 50,
graph_cut_number: 20,
sample_size_multiplier: 7.0,
spatial_coherence_weight: 0.1,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct NeighborhoodSettings {
pub neighborhood_size: f64,
pub neighborhood_grid_density: f64,
pub nearest_neighbor_number: usize,
}
impl Default for NeighborhoodSettings {
fn default() -> Self {
Self {
neighborhood_size: 20.0,
neighborhood_grid_density: 4.0,
nearest_neighbor_number: 6,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct RansacSettings {
pub min_iterations: usize,
pub max_iterations: usize,
pub inlier_threshold: f64,
pub confidence: f64,
pub scoring: ScoringType,
pub sampler: SamplerType,
pub neighborhood: NeighborhoodType,
pub local_optimization: LocalOptimizationType,
pub final_optimization: LocalOptimizationType,
pub termination_criterion: TerminationType,
pub inlier_selector: InlierSelectorType,
pub ar_sampler_settings: ArSamplerSettings,
pub local_optimization_settings: LocalOptimizationSettings,
pub final_optimization_settings: LocalOptimizationSettings,
pub neighborhood_settings: NeighborhoodSettings,
}
impl Default for RansacSettings {
fn default() -> Self {
Self {
min_iterations: 1000,
max_iterations: 5000,
inlier_threshold: 1.5,
confidence: 0.99,
scoring: ScoringType::Magsac,
sampler: SamplerType::Prosac,
neighborhood: NeighborhoodType::Grid,
local_optimization: LocalOptimizationType::NestedRansac,
final_optimization: LocalOptimizationType::Irls,
termination_criterion: TerminationType::Ransac,
inlier_selector: InlierSelectorType::None,
ar_sampler_settings: ArSamplerSettings::default(),
local_optimization_settings: LocalOptimizationSettings::default(),
final_optimization_settings: LocalOptimizationSettings::default(),
neighborhood_settings: NeighborhoodSettings::default(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_ransac_settings_match_cpp_defaults() {
let cfg = RansacSettings::default();
assert_eq!(cfg.min_iterations, 1000);
assert_eq!(cfg.max_iterations, 5000);
assert!((cfg.inlier_threshold - 1.5).abs() < 1e-12);
assert!((cfg.confidence - 0.99).abs() < 1e-12);
assert_eq!(cfg.scoring, ScoringType::Magsac);
assert_eq!(cfg.sampler, SamplerType::Prosac);
assert_eq!(cfg.neighborhood, NeighborhoodType::Grid);
assert_eq!(cfg.local_optimization, LocalOptimizationType::NestedRansac);
assert_eq!(cfg.final_optimization, LocalOptimizationType::Irls);
assert_eq!(cfg.termination_criterion, TerminationType::Ransac);
assert_eq!(cfg.inlier_selector, InlierSelectorType::None);
}
#[test]
fn default_nested_settings_match_cpp_defaults() {
let cfg = RansacSettings::default();
assert_eq!(cfg.ar_sampler_settings, ArSamplerSettings::default());
assert_eq!(
cfg.local_optimization_settings,
LocalOptimizationSettings::default()
);
assert_eq!(
cfg.final_optimization_settings,
LocalOptimizationSettings::default()
);
assert_eq!(cfg.neighborhood_settings, NeighborhoodSettings::default());
}
}