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


import os
import cv2

def extract_unique_chess_pieces(
    image_path="Start_board.png", 
    output_folder="extracted_pieces",
    # --- НАСТРОЙКИ ТОЧНОСТИ ---
    offset_x=0,          # Сдвиг доски слева (в пикселях), если есть рамка
    offset_y=0,          # Сдвиг доски сверху (в пикселях), если есть рамка
    board_width=None,    # Точная ширина доски (если None, берется вся ширина фото)
    board_height=None,   # Точная высота доски (если None, берется вся высота фото)
    inner_margin_pct=0.04 # Отступ внутрь клетки (4%), чтобы убрать линии сетки
):
    os.makedirs(output_folder, exist_ok=True)

    img = cv2.imread(image_path)
    if img is None:
        print(f"Ошибка: не удалось загрузить файл '{image_path}'.")
        return

    img_h, img_w, _ = img.shape

    # Если размеры рабочей области доски не заданы вручную, берем размеры картинки
    bw = board_width if board_width else (img_w - offset_x)
    bh = board_height if board_height else (img_h - offset_y)

    # Точный float-расчет размера одной клетки
    cell_w = bw / 8.0
    cell_h = bh / 8.0

    # Шаблон доски (Standard Layout)
    board_layout = [
        ["black_r", "black_n", "black_b", "black_q", "black_k", "black_b", "black_n", "black_r"],
        ["black_p"] * 8,
        [None] * 8,
        [None] * 8,
        [None] * 8,
        [None] * 8,
        ["white_P"] * 8,
        ["white_R", "white_N", "white_B", "white_Q", "white_K", "white_B", "white_N", "white_R"],
    ]

    saved_pieces = set()  # Множество для отслеживания уже сохраненных фигур

    print("Начало нарезки уникальных фигур...")

    for row in range(8):
        for col in range(8):
            piece_code = board_layout[row][col]

            # Сохраняем фигуру ТОЛЬКО если она есть и ЕЩЁ НЕ сохранялась
            if piece_code and piece_code not in saved_pieces:
                # 1. Точные float-координаты границы клетки
                x1_raw = offset_x + col * cell_w
                y1_raw = offset_y + row * cell_h
                x2_raw = offset_x + (col + 1) * cell_w
                y2_raw = offset_y + (row + 1) * cell_h

                # 2. Небольшой отступ внутрь клетки против попадания линий доски
                pad_w = cell_w * inner_margin_pct
                pad_h = cell_h * inner_margin_pct

                x1 = int(round(x1_raw + pad_w))
                y1 = int(round(y1_raw + pad_h))
                x2 = int(round(x2_raw - pad_w))
                y2 = int(round(y2_raw - pad_h))

                # Вырезаем область
                cropped_square = img[y1:y2, x1:x2]

                # Сохраняем ровно 1 экземпляр каждого типа
                filename = f"{piece_code}.png"
                save_path = os.path.join(output_folder, filename)

                cv2.imwrite(save_path, cropped_square)
                saved_pieces.add(piece_code)
                print(f"✓ Сохранена уникальная фигура: {filename}")

    print(f"\nГотово! Сохранено уникальных типов фигур: {len(saved_pieces)} из 12.")

if __name__ == "__main__":
    # Если на скриншоте есть внешняя рамка с подписями, 
    # укажите отступы offset_x и offset_y в пикселях.
    extract_unique_chess_pieces()