我正在尝试在 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 行。
也许我已经将其中一个矩阵初始化为错误的预期大小,但我真的不知道如何检查这个。
有什么想法吗?