Exemplo n.º 1
0
        private static float CalculateSecondError(KeyPairsTriangle triangle)
        {
            var dist1 = triangle.FirstPair.Key.GetDistance(triangle.SecondPair.Key);
            var dist2 = triangle.SecondPair.Key.GetDistance(triangle.ThirdPair.Key);
            var dist3 = triangle.ThirdPair.Key.GetDistance(triangle.FirstPair.Key);

            return(Math.Abs(dist1 - dist2) + Math.Abs(dist1 - dist3));
        }
Exemplo n.º 2
0
        public static KeyPairsTriangle RansacAlgorithm(
            Dictionary <KeyPoint, KeyPoint> pointPairs,
            int iterationsCount   = 100,
            float r               = 10,
            float R               = 180,
            bool countSecondError = false)
        {
            KeyPairsTriangle bestTriangle = null;
            Mat bestCurrentTransform      = null;
            var minError       = float.MaxValue;
            var minSecondError = float.MaxValue;

            for (int i = 0; i < iterationsCount; i++)
            {
                var triangle = ChooseTriangle(pointPairs, r, R);
                if (triangle == null)
                {
                    continue;
                }

                // For print image
                var _currentTransform = CvInvoke.GetAffineTransform(triangle.GetFirstImageTriangle(), triangle.GetSecondImageTriangle());
                if (_currentTransform.IsEmpty)
                {
                    continue;
                }

                var error = CalculateError(_currentTransform, pointPairs);
                if (error <= minError)
                {
                    if (countSecondError)
                    {
                        var secondError = CalculateSecondError(triangle);
                        if (secondError <= minSecondError)
                        {
                            bestCurrentTransform = _currentTransform;
                            minError             = error;
                            bestTriangle         = triangle;
                        }
                    }
                    else
                    {
                        bestCurrentTransform = _currentTransform;
                        minError             = error;
                        bestTriangle         = triangle;
                    }
                }
            }
            return(bestTriangle);
        }
Exemplo n.º 3
0
        public static Dictionary <KeyPoint, KeyPoint> RansacFilterKeyPoint(Dictionary <KeyPoint, KeyPoint> pointPairs, KeyPairsTriangle traingle, float R)
        {
            var ransacKeyPoints = new Dictionary <KeyPoint, KeyPoint>();

            foreach (var _keyPoint in pointPairs)
            {
                int i = 0;
                foreach (var _pairs in traingle.GetTrianglePairs())
                {
                    var _dist1 = _keyPoint.Key.GetDistance(_pairs.Key);
                    var _dist2 = _keyPoint.Value.GetDistance(_pairs.Value);
                    if (_dist1 < R && _dist2 < R)
                    {
                        i++;
                    }
                }
                if (i == 3)
                {
                    ransacKeyPoints.Add(_keyPoint.Key, _keyPoint.Value);
                }
            }

            return(ransacKeyPoints);
        }