/// <summary> /// Computes the new image size. /// </summary> /// protected override Size CalculateNewImageSize(UnmanagedImage sourceData) { // Calculate source size float w = sourceData.Width; float h = sourceData.Height; // Get the four corners and the center of the image PointF[] corners = { new PointF(0, 0), new PointF(w, 0), new PointF(0, h), new PointF(w, h), new PointF(w / 2f, h / 2f) }; // Project those points corners = homography.Inverse().TransformPoints(corners); // Recalculate image size float[] px = { corners[0].X, corners[1].X, corners[2].X, corners[3].X }; float[] py = { corners[0].Y, corners[1].Y, corners[2].Y, corners[3].Y }; float maxX = Matrix.Max(px); float minX = Matrix.Min(px); float newWidth = Math.Max(maxX, overlayImage.Width) - Math.Min(0, minX); float maxY = Accord.Math.Matrix.Max(py); float minY = Accord.Math.Matrix.Min(py); float newHeight = Math.Max(maxY, overlayImage.Height) - Math.Min(0, minY); // Store overlay image size this.imageSize = new Size((int)Math.Round(maxX - minX), (int)Math.Round(maxY - minY)); // Store image center this.center = Point.Round(corners[4]); // Calculate and store image offset int offsetX = 0, offsetY = 0; if (minX < 0) { offsetX = (int)Math.Round(minX); } if (minY < 0) { offsetY = (int)Math.Round(minY); } this.offset = new Point(offsetX, offsetY); if (Double.IsNaN(newWidth) || newWidth == 0) { newWidth = 1; } if (Double.IsNaN(newHeight) || newHeight == 0) { newHeight = 1; } // Return the final image size return(new Size((int)Math.Ceiling(newWidth), (int)Math.Ceiling(newHeight))); }
/// <summary> /// Converts the value x (which is measured in the scale /// 'from') to another value measured in the scale 'to'. /// </summary> /// public static double[][] Scale(double toMin, double toMax, double[][] x) { return(Scale(Matrix.Min(x, 0), Matrix.Max(x, 0), toMin, toMax, x)); }
/// <summary> /// Returns the maximum column sum of the given matrix. /// </summary> /// public static double Norm1(this double[,] a) { double[] columnSums = Matrix.Sum(a, 1); return(Matrix.Max(columnSums)); }