import cv2
import numpy as np
from skimage.feature import local_binary_pattern


def extract_lbp_top(video_path, radius=2, n_points=8, method='uniform', block_size=10):
    cap = cv2.VideoCapture(video_path)
    frames = []

    # 读取所有帧
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        frames.append(gray)
    cap.release()

    frames = np.array(frames)
    T, H, W = frames.shape  # 时间、空间维度

    # 使用滑动窗口计算 XT, YT 平面
    hist_xy = np.zeros((n_points + 2,))
    hist_xt = np.zeros((n_points + 2,))
    hist_yt = np.zeros((n_points + 2,))

    # LBP on XY plane
    for t in range(0, T, block_size):
        if t >= T:
            break
        lbp = local_binary_pattern(frames[t], n_points, radius, method)
        hist, _ = np.histogram(lbp.ravel(), bins=np.arange(0, n_points + 3), density=True)
        hist_xy += hist

    # LBP on XT plane
    for y in range(0, H, block_size):
        if y >= H:
            break
        xt_plane = frames[:, y, :]
        lbp = local_binary_pattern(xt_plane, n_points, radius, method)
        hist, _ = np.histogram(lbp.ravel(), bins=np.arange(0, n_points + 3), density=True)
        hist_xt += hist

    # LBP on YT plane
    for x in range(0, W, block_size):
        if x >= W:
            break
        yt_plane = frames[:, :, x]
        lbp = local_binary_pattern(yt_plane, n_points, radius, method)
        hist, _ = np.histogram(lbp.ravel(), bins=np.arange(0, n_points + 3), density=True)
        hist_yt += hist

    # 拼接三个平面的直方图作为最终特征向量
    feature_vector = np.concatenate([hist_xy, hist_xt, hist_yt])
    feature_vector /= np.linalg.norm(feature_vector)  # 归一化

    return feature_vector

video_path = r'D:\DESKTOP\2025\44\a1\dataset\org\1.mp4'
features = extract_lbp_top(video_path)
print(f"特征向量维度: {features.shape}")