public HistogramPieceSegmenter(HistChessboardModel histChessboardModel)
 {
     this._histChessboardModel = histChessboardModel;
     difference = new Mat(histChessboardModel.BackgroundModel.Size(), MatType.CV_16SC3); // histChessboardModel.BackgroundModel.Type());
     states     = difference.Clone();
     diffWin    = new Window("Difference from BG");
 }
Beispiel #2
0
        // TODO: Optional<Mat>
        public HistChessboardModel Do(IVideo video)
        {
            HistChessboardModel model = null;
            Mat frame;
            Mat gray        = new Mat();
            Mat thresh      = new Mat();
            var corners     = new Point2f[4];
            var patternSize = new Size(7, 3);
            var threshWin   = new Window("Adaptive Threshold");

            // TODO: each iteration, try different block sizes for the adaptive threshold (height / 4, height / 2, etc)
            do
            {
                frame = video.GetNextFrame();
                if (frame != null && frame.Width + frame.Height > 0)
                {
                    Cv2.CvtColor(frame, gray, ColorConversionCodes.BGR2GRAY);
                    //Cv2.MedianBlur(gray, gray, 5); // Disallows chessboard to be found, because of how it opens/closes corners
                    Cv2.AdaptiveThreshold(gray, thresh,
                                          maxValue: 255.0,
                                          adaptiveMethod: AdaptiveThresholdTypes.GaussianC,
                                          thresholdType: ThresholdTypes.Binary,
                                          blockSize: (gray.Height / 4) | 1,
                                          c: 0.0);
                    threshWin.ShowImage(thresh);

                    var found = Cv2.FindChessboardCorners(thresh, patternSize, out corners,
                                                          ChessboardFlags.None); //, ChessboardFlags.AdaptiveThresh | ChessboardFlags.NormalizeImage);

                    //frame.CopyTo(output);
                    //Cv2.DrawChessboardCorners(output, patternSize, corners, found);
                    //if (!found) Console.Out.WriteLine("Chessboard not found :( ");

                    if (found)
                    {
                        var       boardPoints = new Point2d[21];
                        Point2d[] foundPoints = OCVUtil.Point2fTo2d(corners);
                        for (int c = 0; c < 7; c++)
                        {
                            for (int r = 0; r < 3; r++)
                            {
                                boardPoints[r * 7 + c] = new Point2d((c + 1.0), (r + 3.0));
                            }
                        }

                        var boardToImageTransform = Cv2.FindHomography(boardPoints, foundPoints);
                        var imageToBoardTransform =
                            boardToImageTransform.Inv(); //Cv2.FindHomography(foundPoints, boardPoints);
                        model = new HistChessboardModel(boardToImageTransform, imageToBoardTransform, frame);
                    }
                }
            } while (frame != null && model == null);

            return(model);
        }
Beispiel #3
0
 public void Render(bool[,] state)
 {
     for (int row = 0; row < 8; row++)
     {
         for (int col = 0; col < 8; col++)
         {
             var color = state[row, col] ? Scalar.White :
                         (HistChessboardModel.IsWhiteSquare(row, col) ? WhiteColor : BlackColor);
             Cv2.Rectangle(
                 img: Output,
                 pt1: new Point(row * SquareSize, col * SquareSize),
                 pt2: new Point((row + 1) * SquareSize, (col + 1) * SquareSize),
                 color: color,
                 thickness: -1);
         }
     }
     outWin.ShowImage(Output);
 }
        SquareClassificationScores[,] CalcSquareClassifications(Mat frame)
        {
            var result     = new SquareClassificationScores[8, 8];
            Mat squareMask = new Mat(frame.Size(), MatType.CV_8U);
            var histSize   = new[] { 16, 16, 16 };
            var histRanges = new[] { new Rangef(0f, 256f), new Rangef(0f, 256f), new Rangef(0f, 256f) };

            for (int row = 0; row < 8; row++)
            {
                for (int col = 0; col < 8; col++)
                {
                    squareMask.SetTo(Scalar.Black);
                    _histChessboardModel.DrawSquareMask(row, col, squareMask, HistChessboardModel.SquareMaskScale);
                    Mat squareHist = new Mat();
                    Cv2.CalcHist(
                        images: new[] { frame },
                        channels: new int[] { 0, 1, 2 },
                        mask: squareMask,
                        hist: squareHist,
                        dims: 3,
                        histSize: histSize,
                        ranges: histRanges);

                    var method         = HistCompMethods.Correl;
                    var squareColor    = HistChessboardModel.SquareColor(row, col);
                    var likeWhitePiece = Cv2.CompareHist(
                        h1: squareHist,
                        h2: _histChessboardModel.XOnYHist[(int)ChessColor.White, squareColor],
                        method: method);
                    var likeBlackPiece = Cv2.CompareHist(
                        h1: squareHist,
                        h2: _histChessboardModel.XOnYHist[(int)ChessColor.Black, squareColor],
                        method: method);
                    var likeEmpty = Cv2.CompareHist(
                        h1: squareHist,
                        h2: _histChessboardModel.XOnYHist[(int)SquareState.Empty, squareColor],
                        method: method);
                    result[row, col] = new SquareClassificationScores(new [] { likeWhitePiece, likeBlackPiece, likeEmpty });
                }
            }
            return(result);
        }
Beispiel #5
0
 public void Render(SquareClassificationScores[,] scores)
 {
     for (int row = 0; row < 8; row++)
     {
         for (int col = 0; col < 8; col++)
         {
             var squareState = scores[row, col].MostLikely;
             var color       = squareState ==
                               SquareState.White ? Scalar.White :
                               (squareState == SquareState.Black ? Scalar.Black :
                                (HistChessboardModel.IsWhiteSquare(row, col) ? WhiteColor : BlackColor));
             Cv2.Rectangle(
                 img: Output,
                 pt1: new Point(row * SquareSize, col * SquareSize),
                 pt2: new Point((row + 1) * SquareSize, (col + 1) * SquareSize),
                 color: color,
                 thickness: -1);
         }
     }
     outWin.ShowImage(Output);
 }