本文目录导读:

根据你提到的“显示横传转移球次数”这一需求,这通常是足球数据分析或体育可视化领域的开源项目。
目前有多个开源项目可以做到这一点,最知名且最相关的项目通常基于计算机视觉(跟踪球员和足球)或使用公开的比赛事件数据(如StatsBomb、Sportec等提供的XML/JSON数据)。
以下是几个主要方向的开源项目推荐:
基于事件数据的开源项目(最准确、最推荐)
这类项目依赖于已经标注好的比赛事件数据(谁、什么时间、在哪儿、传给了谁),要统计“横传转移球”,需要自己定义一个筛选逻辑(传球距离 > 30米,且角度接近水平线)。
-
项目名称: StatsBombR / soccerdata (Python)
- 功能: StatsBomb 提供了大量免费的公开比赛数据,你可以通过脚本拉取数据,然后筛选出
type为 “Pass” 且pass.angle在特定范围内的传球(例如角度接近 0 或 π,代表横传)。 - 如何统计横传转移球:
- 下载比赛事件。
- 筛选出所有传球事件。
- 计算每次传球的起点和终点的 y 坐标差值(横传在水平方向移动大)以及x 坐标差值(纵向移动小)。
- 定义一个阈值:
|y_end - y_start| > 30且|x_end - x_start| < 10,则视为一次“横传转移球”。
- Github 搜索关键词:
soccerdata或statsbombpy
- 功能: StatsBomb 提供了大量免费的公开比赛数据,你可以通过脚本拉取数据,然后筛选出
-
项目名称: SoccerAction (各类研究项目)
- 功能: 包含了从比赛视频到数据标注的完整流程,通过其提供的事件数据,可以很容易地提取出“Transfer Pass”(转移传球)。
基于计算机视觉的实时检测(更复杂,但可定制)
如果你想直接从比赛视频中实时或事后统计这些数据,可以使用以下项目。
- 项目名称: SoccerNet (开源视觉数据集和基线)
- 功能: 包含球员检测、跟踪、球检测以及传球识别模型。
- 实践: 你可以使用 SoccerNet 提供的传球检测模型,模型输出会告诉你:时间戳、传球者、接球者、传球坐标。
- 如何统计: 拿到模型输出的坐标后,应用上述数学逻辑(计算传球方向和距离)来过滤出“横传转移球”。
- Github 搜索关键词:
SoccerNet、Action Spotting、Pass Detection
现成的可视化工具(直接可看,但需配置)
- 项目名称: SoccerMap / PySport / mplsoccer (Python 绘图库)
- 功能:
mplsoccer是一个专门绘制足球场地的 Python 库,它本身不计算数据,但你可以结合上面提到的 StatsBomb 数据源,先自己计算出横传转移球,然后用它画出一张传球网络图或射门地图。 - 效果: 在图上用箭头高亮显示那些长距离、横向移动的传球。
- 功能:
最直接的解决方案
如果你只需要结果,不想从零搭建:
- 访问 GitHub 搜索:
"pass map"或"soccer passing network"。 - 寻找使用了
StatsBomb或Wyscout数据的项目。 搜索"awesome-soccer-analytics"或"Friends-of-Tracking-Data-Football"(这个库里有大量的开源项目和论文)。 - 查看具体项目: “Soccer Passing Networks in Python”(这是一个非常流行的教程/项目),它教你如何画出所有传球,但你可以修改代码,只统计和绘制那些“横向、长距离”的传球。
总结建议
- 如果你是开发者/分析师: 直接使用 StatsBombR 或 soccerdata (Python) 获取事件数据,然后自己写一个简单的过滤函数定义“横传转移球”(
距离 > 35米且角度在 30度以内(水平方向))。 - 如果你只是想看有没有现成的功能: 目前没有一个单独的、非常热门的开源项目专门叫“此程序只统计横传转移球次数”,你需要找一个通用足球分析框架(如 SoccerAnalytics, KLoB, PySport),然后在其基础上添加这个过滤规则。
核心算法逻辑:
def is_switch_of_play(pass_event):
start_x, start_y = pass_event['start_coords']
end_x, end_y = pass_event['end_coords']
# 1. 必须是一条长传(横向距离远)
horizontal_distance = abs(end_y - start_y)
# 2. 纵向(进攻方向)变化较小
vertical_distance = abs(end_x - start_x)
if horizontal_distance > 30 and vertical_distance < 15:
return True
return False
如果你想找特定的仓库名,可以告诉我你用的是哪种数据源(视频还是事件数据),我可以给出更精确的仓库链接。