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)); }
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); }
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); }