private Point[] GetLocation(ValueTuple <List <double>, List <double> > mx) { var points = new List <Point>(); var matrix = mx.Item2; foreach (var(cornerX, cornerY) in GetSampleCorners()) { var(pointX, pointY) = Ransac.Transform(matrix, cornerX, cornerY); points.Add(new Point((int)Math.Round(pointX), (int)Math.Round(pointY))); } return(points.ToArray()); }
public static Bitmap Transform(Bitmap pictureA, Bitmap pictureB, List <double> matrixA, List <double> matrixB) { int minX = 0, maxX = pictureA.Width, minY = 0, maxY = pictureA.Height; var points = new List <(double, double)> { Ransac.Transform(matrixB, 0, 0), Ransac.Transform(matrixB, pictureB.Width, 0), Ransac.Transform(matrixB, 0, pictureB.Height), Ransac.Transform(matrixB, pictureB.Width, pictureB.Height) }; minX = (int)Math.Min(minX, points.Min(x => x.Item1)); minY = (int)Math.Min(minY, points.Min(x => x.Item2)); maxX = (int)Math.Max(maxX, points.Max(x => x.Item1)); maxY = (int)Math.Max(maxY, points.Max(x => x.Item2)); int width = maxX - minX, height = maxY - minY; int dx = -minX, dy = -minY; var bitmap = new Bitmap(width, height); var g = Graphics.FromImage(bitmap); g.DrawImage(pictureA, dx, dy, pictureA.Width, pictureA.Height); for (var x = 0; x < bitmap.Width; x++) { for (var y = 0; y < bitmap.Height; y++) { var(nx, ny) = Ransac.Transform(matrixA, x - dx, y - dy); if (nx < 0 || ny < 0 || nx >= pictureB.Width || ny >= pictureB.Height) { continue; } bitmap.SetPixel(x, y, pictureB.GetPixel((int)nx, (int)ny)); } } return(bitmap); } }