Загрузка данных


import cv2
import numpy as np


def crop_board_by_contours(
    input_path="board.png", output_path="cropped_board.png"
):
    # 1. Загрузка изображения
    img = cv2.imread(input_path)
    if img is None:
        print(f"Ошибка: Не удалось найти файл '{input_path}'.")
        return

    # 2. Подготовка изображения (Размытие + Детектор границ Canny)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    edges = cv2.Canny(blurred, 50, 150)

    # 3. Поиск всех контуров на картинке
    contours, _ = cv2.findContours(
        edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
    )

    if not contours:
        print("Контуры не найдены.")
        return

    # 4. Сортируем контуры по площади и ищем наибольший четырехугольник
    contours = sorted(contours, key=cv2.contourArea, reverse=True)

    board_contour = None
    for c in contours:
        peri = cv2.arcLength(c, True)
        approx = cv2.approxPolyDP(c, 0.02 * peri, True)

        # Если у контура 4 вершины — скорее всего, это доска
        if len(approx) == 4:
            board_contour = approx
            break

    # 5. Если четырёхугольник не найден, берём самый большой прямоугольник (Bounding Box)
    if board_contour is None:
        x, y, w, h = cv2.boundingRect(contours[0])
    else:
        x, y, w, h = cv2.boundingRect(board_contour)

    # 6. Вырезаем найденную область и сохраняем
    cropped_img = img[y : y + h, x : x + w]
    cv2.imwrite(output_path, cropped_img)
    print(
        f"Успешно! Доска была найдена и сохранена в файл '{output_path}'."
    )


if __name__ == "__main__":
    crop_board_by_contours()