0

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 行で。

おそらく、マトリックスの1つを間違った予想サイズに初期化したのでしょうが、これを確認する方法が本当にわかりません。

何かご意見は?

4

2 に答える 2

0

正確な問題を特定するには、現在の作業フォルダーにある opencv でコンパイルされた pdb と dll を使用してください。システムでソース コードが利用可能な場合、クラッシュが発生した場所が表示されます。これにより、いくつかのアイデアが得られます。

于 2013-08-23T06:51:34.983 に答える