OpenCV Kalman Filter Error

I used OpenCV to predict the movement of a ball visible with a webcam. However, I keep getting the error in the state of cvKalmanPredict, so I simplify the code in these few lines and try to test the filter exclusively:

        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

However, I still get the same error when calling 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

I am using cmake with MS Visual C ++ 10 to compile.

+3
source share
1 answer

Believable interpretation

When reading a detailed error message, the statement seems to be checked if A and B are the size of D. Presumably this check is performed before computing ( cvKalmanPredict) involving the three matrices.

A, B D, , , (A , , kalmA ..).

, , A, B D . openCV .

:

Variable  Size   Variable  Size   Variable  Size 
kalmA     6x6    kalmQ     6x6    kalmR     3x3
kalmB     6x6    kalmS     6x6         
kalmH     6x6    kalmP     6x6     

.

kalmR - , , .

6x6-, , . , kalmR , .

, A, B D , .

.

, .

, 6x6, 1x36 , 36x1. flags & CV_GEMM_B_T, , , MxN NxM .

, , openCV GEMM ( ). , .

.

a. b.


, . B .

//should that solitary B be an A?
D.rows == .. A.rows && D.cols == .. B.cols && D.type() == A.type()

D A.

D.type() == A.type()

- -, D A D A .

//simplified assertion with B replaced by A
D.rows == .. A.rows && D.cols == .. A.cols  

, -, , , .

type() , && . D A , , , , .

, A B:

D.rows == .. B.rows && D.cols == .. B.cols && D.type == B.type()


, , , , , - openCV - openCV.

( A, B D), GEMM openCV ( ).

. , , .

:

.

D, -.

, D - A B, A B.

, . ( CV_GEMM_A_T, CV_GEMM_B_T, A B, - A B, D, flags.

, D.type() == B.type(), ).

, :

D.rows == .. A.cols && D.type() == A.type() && D.cols == .. B.rows

D A D * A ( , ).

D B - D B - , B * D.

, D * A + B * D , , D * A - B * D - GEMM.

.

, , D , A B. A * B A + B.

D = A * B.

A, B , B = D * A A = B * D

D , .

. - ?

openCV .

, openCV, , : cvMatMul, cvMatMulAdd cvGEMM :

D =   A * B         // cvMatMul
D =   A * B +   C   // cvMatMulAdd 
D = α A * B + β C   // cvGEMM - Generalized Matrix Multiplication 
                    //          alpha, beta are scalars unlike A, B, C, D 

flags A B

, flags CV_GEMM_A_T CV_GEMM_B_T. .

, CV_GEMM_A_T CV_GEMM_B_T, , ( ):

// matrix-size selected by the conditional operator when the ...
D.rows == .. A'.rows && D.cols == .. B'.cols    // ... bit fields are set 
D.rows == .. A .cols && D.cols == .. B .rows    // ... bit fields are unset

, flags & CV_GEMM_A_T flags & CV_GEMM_B_T , .

, flags , , A B. openCV , A, B C .

:

, , , .

, , , .

. , , , .

:

, , , , . .

+5

All Articles