Я работаю над проектом по отслеживанию объектов и хочу улучшить результаты, которые я получаю, используя фильтр Калмана.
Я нашел много примеров в интернете, которые работают, но я действительно хочу понять, что за этим стоит.
Используя opencv, вот часть кода:
KalmanFilter KF(6, 2, 0);
Mat_ state(6, 1);
Mat processNoise(6, 1, CV_32F);
...
KF.statePre.at(0) = mouse_info.x;
KF.statePre.at(1) = mouse_info.y;
KF.statePre.at(2) = 0;
KF.statePre.at(3) = 0;
KF.statePre.at(4) = 0;
KF.statePre.at(5) = 0;
KF.transitionMatrix = *(Mat_(6, 6) << 1,0,1,0,0.5,0, 0,1,0,1,0,0.5, 0,0,1,0,1,0, 0,0,0,1,0,1, 0,0,0,0,1,0, 0,0,0,0,0,1);
KF.measurementMatrix = *(Mat_(2, 6) << 1,0,1,0,0.5,0, 0,1,0,1,0,0.5);
Этот дает более плавные результаты, чем KalmanFilter (4,2,0), но я не совсем понимаю, почему.
Может кто-нибудь объяснить мне, что стоит за этой (6,6) переходной матрицей?
РЕДАКТИРОВАТЬ: решение, вероятно, Вот но, очевидно, я не достаточно хорош, чтобы найти это сам …
Спасибо за помощь.
У вас есть вектор состояния Икс состоит из 6 компонентов, первые два из которых являются позициями x и y объекта; давайте предположим, что остальные 4 являются их скоростями и ускорениями:
Икс = [x, y, v_x, v_y, a_x, a_y] T
В фильтре Калмана, ваше следующее состояние, ИксT + 1, равно предыдущему состоянию ИксT умножается на матрицу перехода , так что с матрицей перехода, которую вы разместили, вы бы получили:
Икс T + 1 = х T + v_x T + 0,5 года T
Y T + 1 = у T + v_y T + 0,5 года T
v_x T + 1 = v_x T + A_x T
v_y T + 1 = v_t T + в T
A_x T + 1 = a_x T
A_Y T + 1 = a_y T
Что представляет собой дискретное приближение уравнений объекта, движущегося с постоянным ускорением, если временной интервал между двумя состояниями равен 1 (и поэтому имеет смысл предположить, что остальные четыре переменные — это скорости и ускорения).
Это фильтр Калмана, который учитывает более быстрые изменения в оценке скорости, поэтому он вводит меньшую задержку, чем (4, 2, 0) фильтр, который будет использовать модель с постоянной скоростью.
Других решений пока нет …