public static List <AnchorBox> GenerateRandomAnchorBoxes()
        {
            var anchorBoxList = new List <AnchorBox>()
            {
                new AnchorBox()
                {
                    Height = 1, Width = 1, X = 0, Y = 0
                }
            };

            foreach (int i in Enumerable.Range(0, 1000))
            {
                anchorBoxList.Add(AnchorBox.GenerateNew());
            }
            return(anchorBoxList);
        }
        private static List <System.Drawing.Rectangle> GetDetectionRectangles(INeuralNetwork neuralNetwork, Image <Bgr, Byte> originalImage, Action <double> progressUpdater)
        {
            List <System.Drawing.Rectangle> DetectedRectangles = new List <System.Drawing.Rectangle>();
            var anchorBoxes = AnchorBox.GenerateRandomAnchorBoxes();
            int counter     = 0;

            Parallel.ForEach(anchorBoxes, new ParallelOptions()
            {
                MaxDegreeOfParallelism = 10
            }, (anchorBox) => {
                (var croppedImage, var rectangle) = GetAreaUnderAnchorBox(originalImage, anchorBox);
                var catDetected = DetectCat(neuralNetwork, croppedImage);
                if (catDetected)
                {
                    DetectedRectangles.Add(rectangle);
                }
                progressUpdater(((double)counter / (double)anchorBoxes.Count()) * 100);
                counter++;
            });
            return(DetectedRectangles);
        }
        private static System.Drawing.Rectangle GetRectangleFromAnchroBox(Image <Bgr, Byte> originalImage, AnchorBox anchorBox)
        {
            int areaX      = (int)((double)(originalImage.Width) * anchorBox.X);
            int areaY      = (int)((double)(originalImage.Height) * anchorBox.Y);
            int areaWidth  = (int)((double)(originalImage.Width) * anchorBox.Width);
            int areaHeight = (int)((double)(originalImage.Height) * anchorBox.Height);

            return(new System.Drawing.Rectangle(areaX, areaY, areaWidth, areaHeight));
        }
        private static (Image <Gray, Byte>, System.Drawing.Rectangle) GetAreaUnderAnchorBox(Image <Bgr, Byte> originalImage, AnchorBox anchorBox)
        {
            var originalImageCopy = originalImage.Copy();
            var rectangle         = GetRectangleFromAnchroBox(originalImageCopy, anchorBox);

            originalImageCopy.ROI = rectangle;
            var croppedImage = LocalImage.ConvertOriginalImageToGrayScaleAndProcess(originalImageCopy.Copy());

            originalImageCopy.ROI = System.Drawing.Rectangle.Empty;
            return(croppedImage, rectangle);
        }