/// <summary> /// Deals with a singe hypothesis /// </summary> /// <param name="h">Hypothesis</param> /// <param name="max_distance">Maximum distance threshold to qualify sample as inlier</param> /// <param name="constraints">Additional constraints</param> private void BuildHypothesis(Ransac <T> .Hypothesis h, double max_distance, IRansacModelConstraint constraints) { // Initial fit T model = h.Model; if (!model.Build(this.ChooseRandom(model.RequiredSamples))) { return; } if (constraints != null && !constraints.Test(model)) { return; } // Model parameters estimated, determine consensus set this.DetermineConsensusSet(h, max_distance); // Refit model using regression method and consensus set if (h.ConsensusIds.Count >= model.RequiredSamples) { model.Fit(h.ConsensusSet); h.ConsensusIds.Clear(); this.DetermineConsensusSet(h, max_distance); } }
/// <summary> /// Run Ransac /// </summary> /// <param name="max_iter">Maximum number of iterations to generate hypothesis</param> /// <param name="max_distance">Maximum distance threshold to qualify sample as inlier</param> public Hypothesis Run(int max_iter, double max_distance, int min_consensus_size, IRansacModelConstraint constraints) { Hypothesis final = null; int i = 0; while (i < max_iter && final == null) { Hypothesis h = new Ransac <T> .Hypothesis(_samples); this.BuildHypothesis(h, max_distance, constraints); if (h.ConsensusIds.Count >= min_consensus_size) { final = h; } ++i; } return(final); }