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"); }
// 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); }
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); }
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); }