我正在开展一个对象跟踪项目,我想改进使用卡尔曼滤波器获得的结果。
我在互联网上发现了许多有效的例子,但我真的想了解它背后的原因。
使用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)转换矩阵的背后是什么吗?
编辑:解决方案可能是here,但显然我不够自己找到它...
感谢您的帮助。
答案 0 :(得分:11)
你有一个由6个分量组成的状态向量 X ,前两个是对象的x和y位置;让我们假设其他4个是他们的速度和加速度:
X = [x,y,v_x,v_y,a_x,a_y] t
在卡尔曼滤波器中,您的下一个状态 X t + 1 等于之前的状态 X t < / sub>乘以转移矩阵 A ,所以对于你发布的转换矩阵,你会得到:
x t + 1 = x t + v_x t + 0.5 a_x t
y t + 1 = y t + v_y t + 0.5 a_y t
v_x t + 1 = v_x t + a_x t
v_y t + 1 = v_t t + a_t t
a_x t + 1 = a_x t
a_y t + 1 = a_y t
如果两个状态之间的时间间隔等于1,那么对象以恒定加速度移动的方程的离散近似(这就是为什么假设其他四个变量是速度和加速度是有意义的)。
这是一个卡尔曼滤波器,允许更快的速度估计变化,因此它引入的延迟低于(4,2,0)滤波器,后者将使用恒定速度模型。