实用脚本统计反越位成功形成单刀几次?

wen 实用脚本 7

本文目录导读:

实用脚本统计反越位成功形成单刀几次?

  1. Python 脚本示例(基于事件数据)
  2. 如果你没有结构化数据,只有GIF/视频
  3. 更简单的“人工辅助”脚本(推荐)

要准确统计“反越位成功形成单刀”的次数,需要一个带事件标注的比赛视频(如英超、德甲官方数据流)或详细的比赛统计表(含越位、射门、关键传球等事件)。

由于我无法直接观看实时比赛视频,如果你需要实用脚本来从数据(如 StatsBomb、Wyscout 或 CSV 事件数据)中统计这个指标,我可以提供一个 Python 脚本框架

该脚本的逻辑是:

  1. 识别反越位:在“越位”事件后,紧接着出现“传球”事件,且传球方向为向前。
  2. 识别成功:传球后,接下来的事件是“射门”(或“控球”),且控球方为原进攻方。
  3. 识别单刀:射门时的坐标距离球门很近(通常是禁区中路,且对方门将外只有防守队员)。

Python 脚本示例(基于事件数据)

假设你有一个 CSV 文件(events.csv),包含以下列: match_id, period, minute, second, team, type(如“传球”、“越位”、“射门”、“抢断”), x(横向坐标0-100), y(纵向坐标0-100), end_x, end_y

import pandas as pd
# 加载数据
df = pd.read_csv('events.csv')
def is_through_ball(row):
    """判断是否为直塞球/反越位传球(向前传球且目标位置较深)"""
    if row['type'] == '传球' and row['end_x'] > row['x'] + 20: # 向前推进超过20码
        return True
    return False
def count_offside_breaks(df):
    """
    核心统计函数:统计反越位成功形成单刀次数。
    逻辑:
    1. 寻找“越位”事件(表示之前有越位嫌疑)。
    2. 检查越位事件后的下一个事件是否为“传球”且为直塞。
    3. 检查该传球后下一个事件是否为“射门”或“被门将扑出”。
    4. 检查射门位置是否在禁区中路(x>80且y在20-80之间)。
    """
    count = 0
    # 按时间和比赛排序
    df = df.sort_values(['match_id', 'period', 'minute', 'second']).reset_index(drop=True)
    for i in range(len(df) - 2): # 需要至少三条连续事件
        # 事件序列:越位 -> 传球 -> 射门
        if (df.loc[i, 'type'] == '越位' and
            df.loc[i+1, 'type'] == '传球' and
            df.loc[i+2, 'type'] in ['射门', '扑救'] # 射门或被扑出都算成功
            ):
            # 检查传球是否为直塞(反越位)
            pass_event = df.loc[i+1]
            if not is_through_ball(pass_event):
                continue
            # 检查射门位置(单刀通常指正对球门,防守球员少于等于1)
            shot_event = df.loc[i+2]
            # 假设x坐标0-100,x越接近100越接近对方球门
            if shot_event['x'] > 75 and shot_event['y'] between...
            # 更精确的单刀判断:门将位置在x=95,且后卫与门将之间距离远
            # 简化条件:射门点在禁区(x>80)且射门时该队无对方防守球员在30米内
            # 这里用坐标简单模拟:
            if shot_event['x'] >= 80 and 20 <= shot_event['y'] <= 80:
                # 需要检查传球时是否有后卫拖后(这需要坐标数据),这里简化为:
                # 如果传球结束点(end_x)离门很近,且之前有越位,则视为单刀
                if pass_event['end_x'] >= 85:
                    count += 1
                    print(f"第{count}次反越位单刀:{df.loc[i, 'minute']}分 {df.loc[i, 'second']}秒")
    return count
if __name__ == "__main__":
    result = count_offside_breaks(df)
    print(f"\n总计反越位成功形成单刀次数:{result}")

如果你没有结构化数据,只有GIF/视频

你可以使用 OpenCV + YOLOv8 做一个简单的视觉检测脚本,但难度较大,核心逻辑如下(概念代码):

# 这不是完整代码,而是思路
import cv2
# 假设你有一个已经标注了球员位置的视频帧序列
def detect_one_on_one(frame, player_boxes, ball_pos):
    # 判断最接近球门的进攻球员与最后一名防守球员的距离
    # 如果进攻球员在禁区,且最后一名防守球员距离他10米以上,且门将位置在球门上,则判定为单刀
    if attacking_player_distance_to_goal < 25 and defensive_line_distance_to_goal > 35:
        return True
    return False

更简单的“人工辅助”脚本(推荐)

如果你在看比赛录像,想快速标记,可以用这个按键计数脚本(配合视频播放器):

import keyboard
import time
count = 0
print("按 's' 键记录一次反越位单刀")
while True:
    if keyboard.is_pressed('s'):
        count += 1
        print(f"已记录 {count} 次,时间:{time.time()}")
        time.sleep(0.2)  # 防抖
    if keyboard.is_pressed('q'):
        print(f"最终计数:{count}")
        break

如果你有具体的数据文件(如 JSON 或 CSV),并希望根据真实比赛(比如昨晚的比赛)统计,请提供文件格式或部分数据示例,我可以帮你写更精确的脚本。

抱歉,评论功能暂时关闭!