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


def detect_highlighted_cells(self, board_img):
    """
    Находит координаты клеток (row, col) с зелёной/желтой подсветкой последнего хода.
    """
    if board_img is None:
        return []

    h, w = board_img.shape[:2]
    cell_h = h // 8
    cell_w = w // 8
    highlighted_cells = []

    for row in range(8):
        for col in range(8):
            y1, y2 = row * cell_h, (row + 1) * cell_h
            x1, x2 = col * cell_w, (col + 1) * cell_w
            cell_crop = board_img[y1:y2, x1:x2]

            # Перевод в HSV для поиска подсветки ходов (зелёный/жёлтый/салатовый)
            hsv = cv2.cvtColor(cell_crop, cv2.COLOR_BGR2HSV)
            
            # Hue 15-85 охватывает диапазоны от желтоватого до ярко-зеленого
            mask_highlight = cv2.inRange(hsv, np.array([15, 25, 40]), np.array([85, 255, 255]))
            
            # Доля подсвеченных пикселей в клетке
            ratio = np.sum(mask_highlight > 0) / (cell_h * cell_w)
            
            # Если подсвечено больше 15% площади клетки — это клетка последнего хода
            if ratio > 0.15:
                highlighted_cells.append((row, col))

    return highlighted_cells


def determine_active_color(self, board_img, board_matrix):
    """
    Определяет чей сейчас ход ('w' или 'b') по подсвеченным клеткам последнего хода.
    """
    highlighted = self.detect_highlighted_cells(board_img)

    # Ищем среди подсвеченных клеток ту, на которой СЕЙЧАС стоит фигура
    for r, c in highlighted:
        piece = board_matrix[r][c]
        if piece != "":
            # Заглавные буквы в FEN — Белые фигуры, строчные — Чёрные
            if piece.isupper():
                print(f"[ACTIVE COLOR]: На подсвеченной клетке {r},{c} Белая фигура '{piece}'. Следующий ход: ЧЁРНЫЕ.")
                return 'b'
            elif piece.islower():
                print(f"[ACTIVE COLOR]: На подсвеченной клетке {r},{c} Чёрная фигура '{piece}'. Следующий ход: БЕЛЫЕ.")
                return 'w'

    # Если подсветка не найдена (например, самая первая позиция на доске)
    return None