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


import os
import time
import cv2
import numpy as np
import mss

# Импортируем наши функции из соседних файлов
from board_detector import crop_chess_board
from hog_scanner import get_hog_features, extract_dominant_piece_color, scan_frame

def print_board(board_matrix, fen):
    os.system('cls' if os.name == 'nt' else 'clear')
    divider = "  +" + "---+" * 8
    print("\n    a   b   c   d   e   f   g   h")
    print(divider)
    for idx, row in enumerate(board_matrix):
        rank = 8 - idx
        row_str = " | ".join([f"{p}" if p != '.' else " " for p in row])
        print(f"{rank} | {row_str} | {rank}")
        print(divider)
    print("    a   b   c   d   e   f   g   h")
    print(f"\nFEN: {fen}")
    print("\n[LIVE LOG] Сканирование экрана... (Нажмите Ctrl+C для остановки)")


def main():
    TEMPLATES_DIR = "extracted_pieces"
    ALL_PIECES = ['K', 'Q', 'R', 'B', 'N', 'P', 'k', 'q', 'r', 'b', 'n', 'p']
    
    PIECES_CONFIG = {
        "K": "white_K.png", "Q": "white_Q.png", "R": "white_R.png",
        "B": "white_B.png", "N": "white_N.png", "P": "white_P.png",
        "k": "black_k.png", "q": "black_q.png", "r": "black_r.png",
        "b": "black_b.png", "n": "black_n.png", "p": "black_p.png"
    }

    print("[1/2] Загрузка HOG-шаблонов...")
    if not os.path.exists(TEMPLATES_DIR):
        print(f"[ОШИБКА] Папка '{TEMPLATES_DIR}' не найдена!")
        return

    templates_hog = {}
    color_database = {}

    for sym, filename in PIECES_CONFIG.items():
        path = os.path.join(TEMPLATES_DIR, filename)
        if not os.path.exists(path):
            continue

        img = cv2.imread(path)
        if img is None:
            continue

        img_50 = cv2.resize(img, (50, 50))
        crop_center = img_50[7:43, 7:43]
        
        templates_hog[sym] = get_hog_features(crop_center)
        color_database[sym] = extract_dominant_piece_color(img_50)

    print("[2/2] Запуск сканирования экрана в реальном времени...")
    
    sct = mss.mss()
    monitor = sct.monitors[1]
    last_fen = ""

    while True:
        start_time = time.time()

        # 1. Скриншот экрана
        sct_img = sct.grab(monitor)
        screen_frame = cv2.cvtColor(np.array(sct_img), cv2.COLOR_BGRA2BGR)

        # 2. Обрезка доски через сторонний модуль board_detector
        cropped_board = crop_chess_board(screen_frame)

        # 3. Сканирование фигур через сторонний модуль hog_scanner
        matrix, current_fen = scan_frame(cropped_board, color_database, templates_hog, ALL_PIECES)

        # 4. Обновление консоли
        if current_fen != last_fen:
            print_board(matrix, current_fen)
            last_fen = current_fen

        # Интервал 3 секунды
        elapsed = time.time() - start_time
        time.sleep(max(0.1, 3.0 - elapsed))


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n\n[ИНФО] Работа программы завершена пользователем.")
    except Exception as e:
        print(f"\n[КРИТИЧЕСКАЯ ОШИБКА]: {e}")
        import traceback
        traceback.print_exc()
        input("\nНажмите Enter, чтобы закрыть окно...")