#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 пикселей
Из того, что я вижу, вам не нужен фильтр Калмана. Если вы только наблюдаете за положением. прогнозируйте и обновляйте, вам это не нужно. Фильтр Калмана действительно эффективен, когда у вас есть несколько датчиков, которые измеряют связанные вещи, или сложное поведение системы. (При высокоскоростной обработке изображений вы часто можете игнорировать гравитацию. Поскольку все ваши движения линейны, у вас есть простая система.)
Чтобы ответить на вопрос: Да, вы можете использовать фильтр Калмана для отслеживания маркера. Однако для такого простого варианта использования это кажется излишеством.