Отслеживание с помощью фильтра Калмана: прогноз против коррекции

#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 каждый раз, когда получается новая пара координат.

Изменить: в этих ссылках вы можете увидеть результаты первого и второго подходов соответственно: Первый подход
, Второй подход