Мое задание состоит в том, что я должен обнаружить баскетбольного мяча в видео. Я прикрепил картинку, где красные точки - атакующие игроки, а защитники - синие. Мяч оранжевый. Скриншот обнаруженного мной видео. Я рассматриваю это видео как (x, y) систему. Я должен учитывать, когда мяч потерян / пропущен. Но в конце я должен обнаружить обработчик мяча. Прямо сейчас это всегда игрок 0 (игроки индексируются от 0 до 4) в качестве обработчика мяча, и при создании видео он добавляет черную точку в обработчик мяча.
Вот код, который уже был предоставил мне:
def add_ball_handler_index(df):
dt = 0.04 * 3
#identify ballhandler
T = len(df.index)
ball_handler_list = [-1] * T
for t in range(1, T):
# calculate speed in ft/s
vx_ball = (df.iloc[t].x_ball - df.iloc[t-1].x_ball)/dt
vy_ball = (df.iloc[t].y_ball - df.iloc[t-1].y_ball)/dt
v_ball = np.sqrt(vx_ball**2 + vy_ball**2)
# if the ball is very fast, assume transition -> no ball handler
if v_ball > 40:
continue
# if the ball is very high (above rim), assume transition -> no ball handler
if df.iloc[t].z_ball > 10:
continue
# find offensive player closest to ball
dist_o = []
dist_d = []
for p in range(5):
# offense
dx = df.iloc[t].x_ball - df.iloc[t]['x_off_%i'%p]
dy = df.iloc[t].y_ball - df.iloc[t]['y_off_%i'%p]
dist_o.append(np.sqrt(dx**2 + dy**2))
#defense
dx = df.iloc[t].x_ball - df.iloc[t]['x_def_%i'%p]
dy = df.iloc[t].y_ball - df.iloc[t]['y_def_%i'%p]
dist_d.append(np.sqrt(dx**2 + dy**2))
closest_o = int(np.argmin(dist_o))
closest_d = int(np.argmin(dist_d))
# no ball handler if ball is 5 feet away from all players
if min([dist_d[closest_d], dist_o[closest_o]]) > 5:
continue
if dist_o[closest_o] < dist_d[closest_d]:
ball_handler_list[t] = closest_o
else:
# -2 indicates defender is closest to ball
ball_handler_list[t] = -2
df['ball_handler'] = ball_handler_list
# smoothen the ball_handler data: if a 'possession' lasts less than 4 frames (0.48s), use previous index
min_length = 4
prev_ball_handler = -1
ball_handler_list = []
for _, g in df.groupby([ (df.ball_handler != df.ball_handler.shift()).cumsum() ]):
current_ball_handler = g.iloc[0]['ball_handler']
if current_ball_handler != -1 and len(g.index) < min_length:
ball_handler_list = ball_handler_list + [prev_ball_handler] * len(g.index)
else:
ball_handler_list = ball_handler_list + g.ball_handler.values.tolist()
prev_ball_handler = current_ball_handler
# -2 indicate defender has the ball, remove this distinction to make it simpler
ball_handler_list = [x if x!=-2 else -1 for x in ball_handler_list]
df['ball_handler'] = ball_handler_list
Так что я не уверен, что еще нужно сделать или добавить. Любые советы?