Spaces:
Runtime error
Runtime error
| import numpy as np | |
| import torch | |
| from utils import * | |
| from processing import * | |
| from threshold import preprocess | |
| import time | |
| import cv2 | |
| from sudoku_solve import Sudoku_solver | |
| import matplotlib.pyplot as plt | |
| # This module performs sudoku solver which input is a image file. | |
| classifier = torch.load('digit_model.h5',map_location ='cpu') | |
| classifier.eval() | |
| def image_solver(img, model): | |
| original_img = img.copy() | |
| threshold = preprocess(img) | |
| corners_img, corners_list, org_img = find_contours(threshold, img) | |
| try: | |
| # Warped original img | |
| warped, matrix = warp_image(corners_list, corners_img) | |
| # Threshold warped img | |
| warped_processed = preprocess(warped) # warped_processed is gray-scaled img | |
| #Get lines | |
| horizontal = grid_line_helper(warped_processed, shape_location=0) | |
| vertical = grid_line_helper(warped_processed, shape_location=1) | |
| # Create mask | |
| if img.shape[0] > 600 or img.shape[1] > 600: | |
| # Resize will get better result ?? | |
| grid_mask = create_grid_mask(horizontal, vertical) | |
| grid_mask = cv2.resize(grid_mask,(600,600), cv2.INTER_AREA) | |
| number_img = cv2.bitwise_and(cv2.resize(warped_processed, (600,600), cv2.INTER_AREA), grid_mask) | |
| else: | |
| grid_mask = create_grid_mask(horizontal, vertical) | |
| # Extract number | |
| number_img = cv2.bitwise_and(warped_processed, grid_mask) | |
| # Split into squares | |
| squares = split_squares(number_img) | |
| cleaned_squares = clean_square_all_images(squares) | |
| # Resize and scale pixel | |
| resized_list = resize_square(cleaned_squares) | |
| norm_resized = normalize(resized_list) | |
| # # Recognize digits | |
| rec_str = recognize_digits(model, norm_resized, original_img) | |
| board = convert_str_to_board(rec_str) | |
| # Solve | |
| unsolved_board = board.copy() | |
| sudoku = Sudoku_solver(board, 9) | |
| start_time = time.time() | |
| sudoku.solve() | |
| solved_board = sudoku.board | |
| # Unwarp | |
| _, warp_with_nums = draw_digits_on_warped(warped, solved_board, unsolved_board) | |
| dst_img = unwarp_image(warp_with_nums, corners_img, corners_list, time.time() - start_time) | |
| return dst_img, solved_board | |
| except TypeError: | |
| print("Can not warp image. Please try another image") | |
| if __name__ == "__main__": | |
| url = "streamlit_app\image_from_user\Test40.jpg" # Url for test image | |
| res, solved_board = image_solver(url, classifier) | |
| cv2.imshow("Result", cv2.resize(res, (700,700), cv2.INTER_AREA)) | |
| cv2.waitKey(0) | |