コード例 #1
0
        // 모델 구하기
        public void CalcModels()
        {
            try
            {
                // 난수 발생 용
                m_Rand        = new Random();
                RANSAC_Models = new List <RANSAC_Model>();

                for (int i = 0; i < 12; i++)
                {
                    // Model 구해서
                    RANSAC_Model Model = new RANSAC_Model();
                    Model.SelectedPoints = SelectTwoPoint(this.InputPoints);

                    CalcConsensusPoints(Model, this.ConsensusThresholdDistance);

                    // RANSAC_Models에 Add.
                    this.RANSAC_Models.Add(Model);
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
コード例 #2
0
        // 지지 점들 구하기
        public void CalcConsensusPoints(RANSAC_Model Model, Double ConsensusThreshold)
        {
            try
            {
                Model.ConsensusPoints.Clear();

                TwoPoints TwoPoints = Model.SelectedPoints;
                Double    distance  = 0;

                Point ptOne = TwoPoints.pt1;
                Point ptTwo = TwoPoints.pt2;

                for (int i = 0; i < this.InputPoints.Count; i++)
                {
                    Double x1 = this.InputPoints[i].X;
                    Double y1 = this.InputPoints[i].Y;

                    // 거리 구하기
                    if (ptTwo.X == ptOne.X)
                    {//x가 같으면
                        distance = Math.Abs(x1 - ptOne.X);
                    }
                    else if (ptTwo.Y == ptOne.Y)
                    {//y가 같으면
                        distance = Math.Abs(y1 - ptOne.Y);
                    }
                    else
                    {
                        // 점(ptOne.X,ptOne.Y)를 지나는 직선의 방정식 : mx-y-m*ptOne.X+ptOne.Y = 0

                        // =====점(x1,y1)과 직선(ax+by+c=0)의 거리 구하는 공식====
                        // |ax1+by1+c|
                        // ------------
                        // 루트(a제곱+b제곱)

                        Double Slope = CalcSlope(TwoPoints);
                        distance = Math.Abs(x1 * Slope + (-y1) + (-Slope * ptOne.X + ptOne.Y)) / (Math.Sqrt(Math.Pow(Slope, 2) + 1));
                    }

                    if (distance < ConsensusThreshold)
                    {
                        Model.ConsensusPoints.Add(this.InputPoints[i]);
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
コード例 #3
0
        public void CalcSelectedPoints()
        {
            try
            {
                // 최대 컨센서스를 갖는 모델은?
                RANSAC_Model Model = new RANSAC_Model();
                foreach (var model in this.RANSAC_Models)
                {
                    if (Model.ConsensusPoints.Count < model.ConsensusPoints.Count)
                    {
                        Model = model;
                    }
                }

                this.SelectedPoints = Model.SelectedPoints;
            }
            catch (Exception)
            {
                throw;
            }
        }
コード例 #4
0
        // Coefficient구하기
        public void CalcCoefficient()
        {
            try
            {
                // 최대 컨센서스를 갖는 모델은?
                RANSAC_Model Model = new RANSAC_Model();
                foreach (var model in this.RANSAC_Models)
                {
                    if (Model.ConsensusPoints.Count < model.ConsensusPoints.Count)
                    {
                        Model = model;
                    }
                }

                // a, b 구하기
                Point  pt1 = Model.SelectedPoints.pt1;
                Point  pt2 = Model.SelectedPoints.pt2;
                double a, b;
                if (pt1.X != pt2.X)
                {
                    a = (pt2.Y - pt1.Y) / (pt2.X - pt1.X);
                    b = (pt2.X * pt1.Y - pt1.X * pt2.Y) / (pt2.X - pt1.X);
                }
                else
                {
                    // X = C 직선 (y축과 평행한 직선)
                    a = -9999;
                    b = -9999;
                }

                this.Coefficient = new Point(a, b);
            }
            catch (Exception)
            {
                throw;
            }
        }