Exemple #1
0
        /// <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);
            }
        }
Exemple #2
0
        /// <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);
        }