Обнаружение обработчика мяча в баскетболе - PullRequest
0 голосов
/ 03 февраля 2020

Мое задание состоит в том, что я должен обнаружить баскетбольного мяча в видео. Я прикрепил картинку, где красные точки - атакующие игроки, а защитники - синие. Мяч оранжевый. Скриншот обнаруженного мной видео. Я рассматриваю это видео как (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

Так что я не уверен, что еще нужно сделать или добавить. Любые советы?

...