Оценить недостающие точки в списке точек - PullRequest
1 голос
/ 24 февраля 2020

Я создаю список (x, y) координат при обнаружении полета мяча в видео. Проблема в том, что для нескольких кадров в середине видео шарик не может быть обнаружен, для этих кадров добавляется список (-1, -1). Есть ли способ оценить истинные (x, y) координаты шара для этих точек?

Например, список отслеживаемых точек:

pointList = [(60, 40), (55, 42), (53, 43), (-1, -1), (-1, -1), (-1, -1), (35, 55), (30, 60)]

Затем возвращается оценка того, что 3 (-1, -1) отсутствующие координаты будут с контекстом для окружающих точек (с сохранением кривой).

Ответы [ 3 ]

1 голос
/ 24 февраля 2020

Если это шар, то теоретически он должен иметь траекторию параболи c, вы можете попытаться подогнать кривую, игнорируя (-1, -1), а затем заменить пропущенные значения.

Что-то вроде ...

import numpy as np

pointList = [(60, 40), (55, 42), (53, 43), (-1, -1), (-1, -1), (-1, -1), (35, 55), (30, 60)]

x, y = list(zip(*[(x, y) for (x, y) in pointList if x>0]))

fit = np.polyfit(x, y, 2)
polynome = np.poly1d(fit)

# call your polynome for missing data, e.g.
missing = (55 - i*(55-35)/4 for i in range(3))
print([(m, polynome(m)) for m in missing])

, дающее ...

[(55.0, 41.971982486554325), (50.0, 44.426515896714186), (45.0, 47.44514924300471)]
1 голос
/ 24 февраля 2020

Вы можете использовать scipys spline для интерполяции пропущенных значений:

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import splprep, splev
pointList = [(60, 40), (55, 42), (53, 43),
             (-1, -1), (-1, -1), (-1, -1), 
             (35, 55), (30, 60)]

# Remove the missing values
pointList = np.array(pointList)
pointList = pointList[pointList[:, 0] != -1, :]

def spline(x, n, k=2):
    tck = splprep(x.T, s=0, k=k)[0]
    u = np.linspace(0.0, 1.0, n)
    return np.column_stack(splev(x=u, tck=tck))

# Interpolate the points with a quadratic spline at 100 points
pointList_interpolated = spline(pointList, n=100, k=2)

plt.plot(*pointList.T, c='r', ls='', marker='o', zorder=10)
plt.plot(*pointList_interpolated.T, c='b')

enter image description here

0 голосов
/ 24 февраля 2020

Если камера не движется - просто мяч, и вы игнорируете ветер, тогда траектория - параболи c. См .: https://en.wikipedia.org/wiki/Trajectory#Uniform_gravity, _ nor_drag_nor_wind

В этом случае установите функцию квадратичного c в точки, которые вы знаете, и вы получите недостающие. Также установите погрешность граничных точек в окрестностях неизвестной области (точки 53,43 и 35, 55) равными 0 или близкими к 0 (без ошибок, большой вес при интерполяции), чтобы при интерполяции ваша интерполяция проходила go через эти points.

Есть несколько библиотек для полиномиальной подгонки. Например, numpy .plyfit : https://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.polynomial.polynomial.polyfit.html

...