【问题标题】:OpenCV Kalman Filter stack overflowOpenCV卡尔曼滤波器堆栈溢出
【发布时间】:2013-08-25 21:56:09
【问题描述】:

我正在尝试在 OpenCV 2.2 中实现用于 3D 跟踪的卡尔曼滤波器。状态变量是坐标 x,y,z 后跟速度 Vx,Vy 和 Vz,我只能测量 x,y 和 z。

我使用了《Learning OpenCV from O'reilly》一书中的一个示例来开始学习,但是当我尝试使该示例适应我的问题时,事情变得有些混乱。

这是我的实现(我已尝试将代码简化为仅相关部分,并且我已经发表了很多评论以希望能够简化阅读)。

    CvKalman* kalman = cvCreateKalman( 6, 3, 0 );

    // Setting the initial state estimates to [0,0,0,0,0,0].
    CvMat* x_k = cvCreateMat( 6, 1, CV_32FC1 );
    cvZero(x_k);

    // Setting the a posteriori estimate to zero.
    cvZero(kalman->state_post);

    // Creating the process noise vector.
    CvMat* w_k = cvCreateMat( 2, 1, CV_32FC1 );

    // Creating the measurement vector.
    CvMat* z_k = cvCreateMat( 6, 1, CV_32FC1 );
    cvZero( z_k );

    // Initializing the state transition matrix.
    float F_kalman[] = { 1,0,0,0.05,0,0, 0,1,0,0,0.05,0, 0,0,1,0,0,0.05, 0,0,0,1,0,0, 0,0,0,0,0,1 };
    memcpy( kalman->transition_matrix->data.fl, F_kalman, sizeof(F_kalman));

    // Initializing the other necessary parameters for the filter.
    cvSetIdentity( kalman->measurement_matrix); 
    cvSetIdentity( kalman->process_noise_cov, cvRealScalar(1e-2) );
    cvSetIdentity( kalman->measurement_noise_cov, cvRealScalar(1e-1) );
    cvSetIdentity( kalman->error_cov_post, cvRealScalar(1));

    // Updates the measurement vector with my sensor values, wich were in the variable xyz (an array of CvScalar).
    cvSetReal1D(z_k,0,xyz[i].val[0]);
    cvSetReal1D(z_k,1,xyz[i].val[1]);
    cvSetReal1D(z_k,2,xyz[i].val[2]);

    cvKalmanPredict(kalman,0);
    cvKalmanCorrect(kalman,z_k);

问题是,当我运行代码时,我得到一个“test.exe 中 0x55a3e757 处未处理的异常:0xC00000FD:堆栈溢出。”在 cvKalmanCorrect 行。

也许我已经将其中一个矩阵初始化为错误的预期大小,但我真的不知道如何检查这个。

有什么想法吗?

【问题讨论】:

    标签: c++ opencv kalman-filter


    【解决方案1】:

    请在您当前的工作文件夹中使用 opencv 编译的 pdb 和 dll 来确定确切的问题。如果您的系统中有可用的源代码,它将显示崩溃发生的位置,这会给您一些想法。

    【讨论】:

    • 对不起,这个答案让我有点困惑,你能重写一下吗?谢谢
    • 如果您包含 opencv 的调试信息,我们可以看到 cvKalmanCorrect 错误发生的位置。但我们现在才知道它发生在 cvKalmanCorrect 的某个地方。
    【解决方案2】:

    我认为错误在于z_k的大小,它应该是(3,1)而不是(6,1),因为其中只有测量的3个标量,确实是测量数组.

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 2017-08-11
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      相关资源
      最近更新 更多