使用卡尔曼滤波器进行跟踪:预测与校正

问题描述

我有一个 CV 跟踪算法,可以实时为我提供感兴趣对象(红球)质心的 2D 坐标。我想使用卡尔曼滤波器来获取下一帧(未来)中球的预测坐标。

问题是我不知道我是否应该:

  • 预测(状态 k),纠正(状态 k),然后再次预测(状态 k+1)。
  • 纠正(状态 k),然后预测(状态 k+1)。
  • 预测(状态 k),正确(状态 k)。

前两种方法给了我不错的结果。然而,在最后一种方法中获得的结果实际上与测量相同(我猜这是因为我没有对下一个未来状态 k+1 进行预测)。

使用卡尔曼滤波器获得下一帧(未来状态 k+1)中球的预测坐标的正确方法是什么?

使用的代码

卡尔曼滤波器的初始化:

kf = cv2.KalmanFilter(4,2) #position x,y and veLocity x,y
kf.measurementMatrix = np.array([[1,0],[0,1,0]],np.float32)
kf.transitionMatrix = np.array([[1,1],1]],np.float32)
kf.processNoiseCov =1*np.array([[1,np.float32)
kf.measurementNoiseCov = 1*np.array([[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,y):

     measured = np.array([[np.float32(coordX)],[np.float32(coordY)]])
     estimate=kf.correct(measured)
     predicted = kf.predict()

     return predicted    

注意:每次获得一对新坐标时,都会在 while 循环中调用函数 Estimate。

编辑:在这链接中,您可以分别看到第一种和第二种方法的结果: First approach Second approach

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...