public Board(Board source)
        {
            height = source.height;
            width = source.width;

            int arraySize = height * width;
            grid = new int[arraySize];

            for (int i = 0; i < arraySize; i++)
            {
                grid[i] = source.grid[i];
            }
        }
        public Board CreateBoard()
        {
            var fullDetection = DrawDetection();

            var sums = ImageTools.CalculateSums(fullDetection);

            List<Point> ColsRanges = ImageTools.ColorRanges(sums.Key, width);
            List<Point> RowsRanges = ImageTools.ColorRanges(sums.Value, height);

            int sizeY = ColsRanges.Count();
            int sizeX = RowsRanges.Count();

            if (sizeX < 1 || sizeY < 1)
                return null;

            Board board = new Board(sizeX, sizeY);

            int colorCounter = 0;
            var colors = Enum.GetValues(typeof(ColorIndex)).Cast<int>().Reverse().ToList();
            foreach(var rectangleList in ColorBoundingRectangles)
            {
                foreach (var rectangle in rectangleList)
                {
                    var position = FindPosition(rectangle, ColsRanges, RowsRanges);
                    if (position.X > -1 && position.Y > -1)
                        board[position.X, position.Y] = colors[colorCounter];
                }
                colorCounter++;
            }
            return board;
        }
        private void UpdateImages(string path)
        {
            if (String.IsNullOrWhiteSpace(path))
                sourceImg = new Image<Bgr, byte>(100, 100);
            else
                sourceImg = new Image<Bgr, byte>(imageFilePath);
            var hsvImg = sourceImg.Convert<Hsv, byte>();

            blueImg = ImageTools.FilterColor(hsvImg, UserSettings.instance.blueMin, UserSettings.instance.blueMax);
            redImg = ImageTools.FilterColor(hsvImg, UserSettings.instance.RedRange);
            greenImg = ImageTools.FilterColor(hsvImg, UserSettings.instance.greenMin, UserSettings.instance.greenMax);
            yellowImg = ImageTools.FilterColor(hsvImg, UserSettings.instance.yellowMin, UserSettings.instance.yellowMax);
            composedImg = ImageTools.CombineMaps(new List<KeyValuePair<Image<Gray, byte>, Bgr>>
            {
                new KeyValuePair<Image<Gray, byte>, Bgr>(blueImg, ImageTools.Colors.Blue),
                new KeyValuePair<Image<Gray, byte>, Bgr>(redImg, ImageTools.Colors.Red),
                new KeyValuePair<Image<Gray, byte>, Bgr>(greenImg, ImageTools.Colors.Green),
                new KeyValuePair<Image<Gray, byte>, Bgr>(yellowImg, ImageTools.Colors.Yellow),

            });

            if (operation == OperationType.Detection)
            {
                DetectionData ddb = ImageTools.DetectSquares(blueImg);
                DetectionData ddr = ImageTools.DetectSquares(redImg);
                DetectionData ddg = ImageTools.DetectSquares(greenImg);
                DetectionData ddy = ImageTools.DetectSquares(yellowImg);

                ddb.RemoveNoises();
                ddr.RemoveNoises();
                ddg.RemoveNoises();
                ddy.RemoveNoises();

                DetectionData common = new DetectionData(ddb);
                common.AddColor(ddr);
                common.AddColor(ddg);
                common.AddColor(ddy);

                composedImg = common.DrawDetection().Convert<Bgr,byte>();
                blueImg = ddb.DrawDetection();
                redImg = ddr.DrawDetection();
                greenImg = ddg.DrawDetection();
                yellowImg = ddy.DrawDetection();

                this.board = common.CreateBoard();
            }
        }