【发布时间】:2012-05-14 14:32:30
【问题描述】:
我使用 OpenCV 来预测通过网络摄像头看到的球的运动。但是我不断收到关于 cvKalmanPredict 状态的错误,因此我将代码简化为这几行并尝试单独测试过滤器:
CvKalman* kalman = cvCreateKalman(6,3,1);
kalman->temp2 = cvCreateMat(1, 1, CV_32FC1);
float alpha = 0.1, beta = 0.2;
float kalmA[] = {1.0+t0/t1, 0, 0, -t0/t1, 0, 0,
0, 1.0+t0/t1, 0, 0, -t0/t1, 0,
0, 0, 1.0+t0/t1, 0, 0, -t0/t1,
1, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0};
float kalmB[] = {0, 0, 1, 0, 0, 0};
float kalmH[] = {1, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0};
float kalmQ[] = {alpha, 0, 0, 0, 0, 0,
0, alpha, 0, 0, 0, 0,
0, 0, beta, 0, 0, 0,
0, 0, 0, alpha, 0, 0,
0, 0, 0, 0, alpha, 0,
0, 0, 0, 0, 0, beta};
float kalmR[] = {alpha, 0, 0,
0, alpha, 0,
0, 0, beta};
float kalmS[] = {0,0,0, 0, 0, 0};
float kalmP[] = {480, 0, 0, 0, 0, 0,
0, 480, 0, 0, 0, 0,
0, 0, 480, 0, 0, 0,
0, 0, 0, 480, 0, 0,
0, 0, 0, 0, 480, 0,
0, 0, 0, 0, 0, 480};
memcpy( kalman->transition_matrix->data.fl, kalmA, sizeof(kalmA) );
memcpy( kalman->control_matrix->data.fl, kalmB, sizeof(kalmB) );
memcpy( kalman->measurement_matrix->data.fl, kalmH, sizeof(kalmH) );
memcpy( kalman->process_noise_cov->data.fl, kalmQ, sizeof(kalmQ) );
memcpy( kalman->measurement_noise_cov->data.fl, kalmR, sizeof(kalmR) );
// initialize state and covariance
memcpy( kalman->state_post->data.fl, kalmS, sizeof(kalmS) );
cvSetIdentity( kalman->error_cov_post, cvRealScalar(3));
// update the control
float t0 = 0.3;
cvSetReal2D( kalman->temp2, 0, 0, -490 * t0 * t0 );
const CvMat* kalmanPred = cvKalmanPredict(kalman, kalman->temp2);
CvMat* kalmMeas = cvCreateMat(3,1,CV_32FC1);
cvSetReal2D(kalmMeas, 0, 0, 3);
cvSetReal2D(kalmMeas, 1, 0, 2);
cvSetReal2D(kalmMeas, 2, 0, 5.5);
cvKalmanCorrect(kalman, kalmMeas);
cvReleaseMat(&kalmMeas);
// release memory
但是,我在调用 cvKalmanPredict 时仍然遇到同样的错误:
OpenCV Error: Assertion failed ((D.rows == ((flags & CV_GEMM_A_T) == 0 ? A.rows : A.cols)) && (D.cols == ((flags & CV_GEMM_B_T) == 0 ? B.cols : B.rows)) && D.type() == A.type() in unknown function. file C:\Users\opencv\modules\core\src\matmul.cpp. line 2930
我正在使用带有 MS Visual C++ 10 的 cmake 进行编译。
【问题讨论】:
-
您的尺寸或类型似乎有问题。将矩阵复制到
kalman->transition_matrix->data和其他人之后,您是否检查过它们的样子? -
我在调用 kalmanPredic 之前为所有矩阵打印 data.fl 中的内容。对我来说一切正常,这就是为什么我不知道这个错误来自哪里。
标签: c++ opencv kalman-filter