public Sudoku(Bitmap image, int size = 9) { Size = size; Matrix = new Cell[Size, Size]; Field = new GameFieldRecognizer(image).Recognize(); Matrix = CellValueRecognizer.RecognizeDigits(Field, Size); var solver = new SudokuSolver(Matrix); Matrix = solver.Calculate(); SolvingTime = solver.SolvingTime.ElapsedMilliseconds; }
private void DemonstrationBut_Click(object sender, RoutedEventArgs e) { var openImage = new OpenFileDialog() { Filter = "Image|*.BMP;*.JPG;*.GIF;*.PNG|All files|*.*" }; openImage.ShowDialog(); if (openImage.FileName == "") { return; } try { Views.DemonstrationWindow demWin; var bmp = new Bitmap(openImage.FileName); var gameRecognizer = new GameFieldRecognizer(bmp); // stage 1 demWin = new Views.DemonstrationWindow() { Title = "Stage 1. Download Image" }; demWin.image.Source = bmp.ToImageSource(); demWin.ExplainBox.Text = "Photo which is needed to process and calculate"; demWin.ShowDialog(); // stage 2 var preparedImage = gameRecognizer.PrepareImage(); demWin = new Views.DemonstrationWindow() { Title = "Stage 2. Processing image" }; demWin.image.Source = preparedImage.Bitmap.ToImageSource(); demWin.ExplainBox.Text = "Photo after processing"; demWin.ShowDialog(); // stage 3 var gameContour = gameRecognizer.FindField(preparedImage); demWin = new Views.DemonstrationWindow() { Title = "Stage 3. Finding field" }; var img = gameRecognizer.Image.Clone(); img.DrawPolyline(gameContour.ToPoints().CorrectOrder(), true, new Emgu.CV.Structure.Bgr(Color.Green), img.Size.Width / 100); demWin.image.Source = img.ToBitmapSource(); demWin.ExplainBox.Text = "Found game field in green rectangle"; demWin.ShowDialog(); // stage 4 demWin = new Views.DemonstrationWindow() { Title = "Stage 4. Cutting field" }; var gameFieldImg = gameRecognizer.CutField(gameContour); demWin.image.Source = gameFieldImg.Bitmap.ToImageSource(); demWin.ExplainBox.Text = "Cut game field from original photo"; demWin.ShowDialog(); // stage 5 var sudoku = CellValueRecognizer.RecognizeDigits(gameFieldImg); demWin = new Views.DemonstrationWindow() { Title = "Stage 5. Recognizing digits" }; Sudoku.DrawDigits(gameFieldImg, sudoku); demWin.image.Source = gameFieldImg.Bitmap.ToImageSource(); demWin.ExplainBox.Text = "Recognized and then painted digits on the game field"; demWin.ShowDialog(); // stage 6 var solver = new SudokuSolver(sudoku); bool run = true; while (run) { run = solver.FindOnePossible(); if (run == false) { run = solver.FindOnlyHere(); } } demWin = new Views.DemonstrationWindow() { Title = "Stage 6. Solving sudoku" }; Sudoku.DrawDigits(gameFieldImg, solver.Matrix); demWin.image.Source = gameFieldImg.Bitmap.ToImageSource(); demWin.ExplainBox.Text = $"Solved unknown sudoku values using simple methods"; demWin.ShowDialog(); if (!solver.Matrix.IsSolved()) { // stage 7 solver.RecursiveMethod(); demWin = new Views.DemonstrationWindow() { Title = "Stage 7. Solving sudoku, part 2" }; Sudoku.DrawDigits(gameFieldImg, solver.Matrix); demWin.image.Source = gameFieldImg.Bitmap.ToImageSource(); demWin.ExplainBox.Text = $"Solved of the remaining unknown sudoku values using recursive method"; demWin.ShowDialog(); } } catch (System.Exception error) { MessageBox.Show($"Some error\nSource: {error.Source}\nMessage: {error.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); } }