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()