本文目录导读:

“凌空抽射”的统计要看你想统计什么场景,下面给你几个实用脚本方向,按需取用。
足球比赛视频:统计凌空抽射次数
如果你有比赛视频,想统计“凌空抽射”出现次数,可以用 Python + OpenCV + 简单动作识别:
import cv2
import numpy as np
def detect_volley(video_path, output_path=None):
"""
简易凌空抽射检测:
通过检测球员脚部快速上摆 + 球在空中的组合动作来粗略计数
"""
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
frame_count = 0
volley_count = 0
prev_gray = None
motion_history = []
# 球检测:用颜色/圆形检测粗略找球
def detect_ball(frame):
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 白色球(可根据实际调整)
mask = cv2.inRange(hsv, (0, 0, 200), (180, 40, 255))
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
area = cv2.contourArea(c)
if 50 < area < 2000:
(x, y), r = cv2.minEnclosingCircle(c)
return (int(x), int(y), int(r))
return None
while True:
ret, frame = cap.read()
if not ret:
break
frame_count += 1
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
ball = detect_ball(frame)
if ball:
x, y, r = ball
# 球在画面中上部,视为空中
if y < frame.shape[0] * 0.5:
motion_history.append((frame_count, x, y))
# 简单逻辑:短时间内球从空中快速下坠 + 附近有大幅腿部动作
# 这里只做示例,实际需要更精细的模型
if len(motion_history) > 5:
recent = motion_history[-5:]
dy = recent[-1][2] - recent[0][2]
if abs(dy) > 30: # 球快速垂直移动
volley_count += 1
motion_history.clear()
prev_gray = gray
cap.release()
print(f"总帧数: {frame_count}, 粗略凌空抽射次数: {volley_count}")
return volley_count
# 使用
# detect_volley("match.mp4")
这个脚本只能做非常粗略的估计,真正准确统计需要:
- 目标检测模型(YOLO)识别球员和球
- 姿态估计(MediaPipe/OpenPose)判断腿部动作
- 轨迹分析判断球是否在空中被击打
更实用的方案:用现成模型
# 推荐组合
# pip install ultralytics mediapipe
from ultralytics import YOLO
import mediapipe as mp
# YOLO 检测球和球员
model = YOLO("yolov8n.pt")
# MediaPipe 做姿态估计,判断"脚部高于髋部"等凌空特征
mp_pose = mp.solutions.pose
凌空抽射的判定条件可以设为:
- 球在空中(y 坐标低于球员脚部)
- 球员脚部快速摆动
- 球速突然变化
文字/数据统计场景
如果你是想统计文字报道、弹幕、评论里“凌空抽射”出现次数:
import re
from collections import Counter
def count_volley_mentions(text):
keywords = ["凌空抽射", "凌空", "抽射", "volley", "volley shot"]
results = {}
for kw in keywords:
results[kw] = len(re.findall(kw, text, re.IGNORECASE))
return results
# 示例
text = open("match_report.txt", encoding="utf-8").read()
print(count_volley_mentions(text))
直接回答你的问题
如果你问的是“凌空抽射次数多不多”这个统计本身是否常见:
- 在单场比赛里,真正的凌空抽射通常 0–3 次,属于稀有高光动作
- 在赛季数据里,顶级联赛球员一个赛季凌空抽射尝试也就 几次到十几次
- 次数多不多”结论一般是:不多,属于低频但高观赏性动作
你具体想统计什么?告诉我:
- 视频文件?
- 文字数据?
- 还是某个球员/球队的赛季数据?
我可以给你更精准的脚本。