3

我有几个问题:卡尔曼滤波器:有些怀疑

  1. example OpenCV的文件中给出:

    /*生成测量*/ cvMatMulAdd(kalman-> measurement_matrix,状态,测量,测量 );

这是正确的吗? 在教程:An Introduction to the Kalman Filter由韦尔奇和Bishop 在等式1.2它说测量= H *状态+测量噪声

似乎并不都是一样的。

  1. 我试图实现bouncing ball tracking单球。 我试过如下:(请指出,如果我不当做这件事。)

对于我测量两点测量:球的质心的)X B)Y。

我只是提到了与opencv文档中给出的示例不同的行。

CvKalman* kalman = cvCreateKalman(5, 2, 0); 
const float A[] = { 1, 0, 1, 0, 0, 
     0, 1, 0, 1, 0, 
     0, 0, 1, 0, 0, 
     0, 0, 0, 1, 1, 
     0, 0, 0, 0, 1}; 

CvMat* state = cvCreateMat(5, 1, CV_32FC1); 
CvMat* measurement = cvCreateMat(2, 1, CV_32FC1); 

//initialize the state of kalman filter 
      state->data.fl[0] = mean_c; 
      state->data.fl[1] = mean_r; 
      state->data.fl[2] = mean_c - prev_mean_c; 
      state->data.fl[3] = mean_r - prev_mean_r; 
      state->data.fl[4] = 9.81; 

初始化后,这是什么让崩溃

cvMatMulAdd(kalman-> transition_matrix,州, kalman-> process_noise_cov,状态);

+0

检查此链接一个线程卡尔曼解释讨论: http://stackoverflow.com/questions/5478881/kalman-filtering-for-programmers – 2012-05-28 08:43:06

回答

3
  1. 在这一行他们只是使用变量测量来存储噪声。参见前面的行:

    cvRandArr(& RNG,测量,CV_RAND_NORMAL,cvRealScalar(0),cvRealScalar(SQRT(kalman-> measurement_noise_cov-> data.fl [0])));

  2. 您应该更改H矩阵的维数。它必须是5乘以2才能计算出H*state + measurement noise。你会得到一个错误,大概在行

    memcpy(cvkalman-> measurement_matrix-> data.fl,H,sizeof(H));

因为在初始示例cvkalman->measurement_matrixH由4点矩阵分配为4和你由2只至5下降的cvkalman->measurement_matrix尺寸(4 * 4超过5 * 2)

+1

谢谢你清除我的疑问。他们应该已经命名了变量measurement_noise。 但我认为在openCV文档中的例子中,H是2乘2的矩阵而不是4乘4. 这个[示例(url链接)](http://www.ee.surrey.ac.uk/Projects/SEP/ 0607/vision/Code/Onboard%20Visual%20System/kalman.cpp)帮助我更好地理解。 – 2011-05-13 02:49:08

+0

如果状态矢量的维数为n,测量维数为m,那么测量矩阵用m表示, – Andrey 2011-05-13 06:40:40