Отслеживание и прогнозирование фильтра Калмана для видеокадров

#matlab #image-processing #prediction #matlab-cvst #kalman-filter

#matlab #обработка изображений #прогнозирование #matlab-cvst #kalman-filter

Вопрос:

Я новичок в фильтрации Калмана, но возможно ли применить фильтр Калмана для прогнозирования и отслеживания объектов в видеокадрах с использованием MATLAB?

Дополнительная информация: У меня есть последовательный набор из 20 изображений пули, вылетающей из пистолета (серийный снимок изображений). Я произвел некоторую обработку изображений на кадрах, и теперь я могу указать маркер в виде точки. Могу ли я предсказать положение маркера в 21-м кадре?

ПРИМЕЧАНИЕ: Я узнал, что мне нужно зациклить кадры изображения и сделать видео, а затем поместить его для прогнозирования фильтра Калмана. Но возможно ли выполнить прогнозирование, не превращая кадры в видео.

Спасибо.

Ответ №1:

Если вы применили фильтр Калмана для начальных 20 кадров, то вам будет понятен следующий ответ.

Если у вас нет 21-го кадра.

Затем X(t 1) = A*X(t) B(u) Noise

Это оператор predict, и вы можете предсказать значение в 21-м кадре. A = состояние, атрикс, B = матрица управления. X (t) = положение маркера в 20-м кадре, назначенное фильтром Калмана.

Если у вас нет 21-го кадра, то вы можете использовать указанное выше значение, чтобы показать маркер в 21-м кадре. Это одна из основных функций фильтра Калмана, т. Е. даже если у вас нет значения наблюдения, вы все равно можете предсказать значение в следующем кадре., что является очень распространенным практическим случаем, потому что большую часть времени датчики не выбирают объекты, и значения наблюдения нет.

И если вы получаете 21-й кадр, тогда возьмите значение наблюдения и обновите свой прогноз.

Я бы порекомендовал ознакомиться с руководством студента Дейва на YouTube по фильтрам Калмана и отслеживанию. И перейдите к курсу udacity по ссылке Udacity.

Функция фильтра Калмана для вашей проблемы хотела бы

     void Kalman_Filter(float *Zx, float *Zy)
{

    Mat Zt = (Mat_<float>(2, 1) << *Zx, *Zy);

    //prediction
    Predict = A*Prior;//  B*a;

    //covariacne
    P = P*P*A.t()   Ex;

    //measurement uopdate
    Mat Kt = P*H.t()*(H*P*H.t()   Ez);
    //
    Prior = Predict   Kt*(Zt - H*Predict);
    //
    P = (I - Kt*H)*P;
    //
    *Zx = Prior.at<float>(0, 0);
    *Zy = Prior.at<float>(1, 0);
    //
    return;

}
  

здесь * Zx и * Zy являются значениями наблюдения и содержат положение x и y маркера размера точки, который вы выяснили.

Ответ №2:

«Система компьютерного зрения Tooblox» имеет реализацию фильтров Калмана: vision.KalmanFilter

В документации есть демонстрация, которая показывает это в действии:

Использование фильтра Калмана для отслеживания объектов

Обратите внимание, что не имеет значения, откуда поступают кадры (может быть последовательность изображений или фактическое видео).

Ответ №3:

Предсказать положение не очень сложно. Вы усредняете изменения положения с течением времени и используете это для прогнозирования нового положения.

Например, предположим, что ваш маркер находится в позиции 50, 46, 41, 37 в последующих кадрах с известной (и постоянной) частотой кадров. Различия в позициях составляют -4, -5, -4. Используйте среднее значение по своему вкусу. (Фильтр Калмана использует экспоненциальное усреднение) Средняя скорость составляет -4.33

Следовательно, прогнозируемое положение в следующем кадре составляет 37 (-4.33) = 32.67 пикселей

Из того, что я вижу, вам не нужен фильтр Калмана. Если вы только наблюдаете за положением. прогнозируйте и обновляйте, вам это не нужно. Фильтр Калмана действительно эффективен, когда у вас есть несколько датчиков, которые измеряют связанные вещи, или сложное поведение системы. (При высокоскоростной обработке изображений вы часто можете игнорировать гравитацию. Поскольку все ваши движения линейны, у вас есть простая система.)

Чтобы ответить на вопрос: Да, вы можете использовать фильтр Калмана для отслеживания маркера. Однако для такого простого варианта использования это кажется излишеством.