实用脚本统计界外球进攻威胁次数?

wen 实用脚本 2

本文目录导读:

实用脚本统计界外球进攻威胁次数?

  1. 核心定义
  2. 方案一:基于事件日志(最适合数据分析)
  3. 方案二:基于视频分析(适合初学者/无数据)
  4. 方案三:Excel/CSV处理(最轻量级)
  5. 推荐的最优流程(实际项目建议):
  6. 扩展:如何输出到文件?

这是一个用于统计界外球进攻威胁次数的实用脚本思路和实现方案,我会提供一个基于Python的可运行脚本,并解释其原理,方便你根据实际需求(如视频分析或事件日志)进行调整。

核心定义

在足球数据分析中,“界外球进攻威胁”通常指:进攻方在对方半场(或最后30米区域)获得的界外球,且在随后的短时间内(如5秒内)发生了关键事件(如射门、传中、禁区外触球、形成攻门机会)。


基于事件日志(最适合数据分析)

如果你有一份比赛事件数据(含界外球、射门、关键事件时间戳),可以用这个脚本:

import json
# 示例数据格式(可使用StatsBomb/Wyscout导出数据调整)
events = [
    {"type": "throw_in", "team": "A", "minute": 45, "second": 30, "x": 85, "y": 40, "outcome": "success"},
    {"type": "shot", "team": "A", "minute": 45, "second": 35, "x": 88, "y": 45, "outcome": "blocked"},
    {"type": "throw_in", "team": "B", "minute": 50, "second": 10, "x": 20, "y": 30, "outcome": "success"},
    # ...更多数据
]
def count_throw_in_threats(events, time_window=5, x_threshold=70):
    """
    统计界外球进攻威胁次数
    :param events: 事件列表
    :param time_window: 界外球后多少秒内算威胁
    :param x_threshold: 界外球位置阈值(对方半场,即x>70)
    """
    threats = 0
    throw_ins = [e for e in events if e["type"] == "throw_in" and e["x"] >= x_threshold]
    for throw_in in throw_ins:
        # 计算当前时间点(分钟+秒)
        throw_time = throw_in["minute"] * 60 + throw_in["second"]
        # 查看后续事件是否存在威胁
        for event in events:
            if event["type"] == "throw_in":
                continue
            event_time = event["minute"] * 60 + event["second"]
            if event_time <= throw_time:
                continue
            if event_time > throw_time + time_window:
                break
            # 威胁定义:射门、传中、禁区触球、助攻机会
            if event["type"] in ["shot", "cross", "key_pass"] and event["team"] == throw_in["team"]:
                threats += 1
                break  # 同一界外球只算一次威胁
    return threats
# 执行
threat_count = count_throw_in_threats(events)
print(f"界外球进攻威胁次数: {threat_count}")

基于视频分析(适合初学者/无数据)

如果你只有比赛视频,需要用到计算机视觉,这个脚本会减少工作量,但需要安装opencv-python

import cv2
import numpy as np
def detect_throw_in_threat_from_video(video_path):
    """
    使用视频算法统计界外球威胁(简化版)
    原理:检测到界外球手势(裁判/球员举球)后,监控接下来5秒是否发生射门(画面突变/球速变化)
    """
    cap = cv2.VideoCapture(video_path)
    fps = cap.get(cv2.CAP_PROP_FPS)
    frame_count = 0
    throw_in_frames = []  # 保存疑似界外球帧
    threat_count = 0
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        frame_count += 1
        # 简化:使用运动检测 + 球检测
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 检测界外球(画面上方出现静止人群/球员举球动作)
        # 这里用HSV颜色检测白色/黄色球衣集中出现(简化逻辑)
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        # 示例:检测画面中央是否有高举的双臂(肤色区域)
        skin_lower = np.array([0, 50, 80], dtype=np.uint8)
        skin_upper = np.array([20, 255, 255], dtype=np.uint8)
        mask = cv2.inRange(hsv, skin_lower, skin_upper)
        skin_ratio = cv2.countNonZero(mask) / (frame.shape[0] * frame.shape[1])
        # 假设:皮肤比例突然显著上升且位置在边线附近 → 界外球
        if skin_ratio > 0.1 and frame_count > fps * 30:  # 只统计比赛30秒后
            # 模拟:实时记录当前时间点
            throw_time = frame_count / fps
            # 检查接下来5秒是否出现射门(画面中心剧烈运动)
            future_end = frame_count + int(fps * 5)
            # ...这里需要更精确的射门检测算法
    cap.release()
    return threat_count
# 使用(需结合具体进球识别模型)
# count = detect_throw_in_threat_from_video("match.mp4")

Excel/CSV处理(最轻量级)

如果你用Excel整理数据,可以直接用公式:

=COUNTIFS(B:B, "throw_in", D:D, ">70", 
   A:A, ">=" & B2, 
   A:A, "<=" & B2 + 5, 
   C:C, "shot")

推荐的最优流程(实际项目建议):

  1. 获取数据:首选 StatsBomb公开数据(免费)或Wyscout,直接有结构化事件。
  2. 数据清洗:只保留对方半场的界外球,过滤与时间表。
  3. 威胁定义:明确阈值(x >= 70, 时间差 <= 5秒, 事件 ∈ {射门, 传中, 造成对方犯规})。
  4. 自动化输出:用Python生成统计报告(部分功能**也支持直接生成图形化报告)。

扩展:如何输出到文件?

with open("threat_report.json", "w") as f:
    json.dump({"total_threats": threat_count, "details": []}, f)

如果你有具体的比赛数据文件格式,或者需要视频分析的关键帧提取算法,可以告诉我更多细节,我来调整代码。

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