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, чтобы закрыть окно...")