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つを間違った予想サイズに初期化したのでしょうが、これを確認する方法が本当にわかりません。
何かご意見は?