#python #opencv #computer-vision #kalman-filter #video-tracking
Вопрос:
У меня есть алгоритм отслеживания CV, который дает мне 2D координаты центроида интересующего объекта (красный шар) в режиме реального времени. Я хочу использовать фильтр Калмана для получения прогнозируемых координат шара в следующем кадре (будущем).
Дело в том, что я не знаю, должен ли я:
- Предсказать (состояние k), Исправить (состояние k), а затем снова предсказать (состояние k 1).
- Исправьте (состояние k), а затем предсказайте (состояние k 1).
- Предсказать (состояние k), Исправить (состояние k).
Первые два подхода дали мне достойные результаты. Однако результаты, полученные в последнем подходе, были практически такими же, как и в mesures (я думаю, это потому, что я не делаю прогноз для следующего будущего состояния k 1).
Как правильно получить предсказанные координаты шара в следующем кадре (будущее состояние k 1) с помощью фильтра Калмана?
Используемый код:
Инициализация фильтра Калмана:
kf = cv2.KalmanFilter(4, 2) #position x,y and velocity x,y
kf.measurementMatrix = np.array([[1, 0, 0, 0], [0, 1, 0, 0]], np.float32)
kf.transitionMatrix = np.array([[1, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32)
kf.processNoiseCov =1*np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32)
kf.measurementNoiseCov = 1*np.array([[1, 0], [0, 1]], np.float32)
Первый подход:
def Estimate(kf,x,y):
predicted = kf.predict()
measured = np.array([[np.float32(coordX)], [np.float32(coordY)]])
estimate=kf.correct(measured)
predicted = kf.predict()
return predicted
Второй подход:
def Estimate(kf,x,y):
measured = np.array([[np.float32(coordX)], [np.float32(coordY)]])
estimate=kf.correct(measured)
predicted = kf.predict()
return predicted
Примечание: Оценка функции вызывается внутри цикла while каждый раз, когда получается новая пара координат.
Изменить: в этих ссылках вы можете увидеть результаты первого и второго подходов соответственно: Первый подход
, Второй подход