示例#1
0
        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());
        }
示例#2
0
        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);
        }
    }