2016-02-15 2 views
3

J'essaye d'implémenter un filtre de Kalman dans mon programme OpenCV en Java. Je suis nouveau à la fois OpenCV et Kalman Filter. J'ai trouvé quelques exemples en C++ (pas beaucoup en Java) et c'est ce que j'ai jusqu'à présent:Implémentation du filtre de Kalman dans OpenCV Java

Initialisation:

//create kalman filter 
    KalmanFilter kalman = new KalmanFilter(4,2,0,CvType.CV_32F); 
    //set transition matrix 
    float[] tM = { 1, 0, 1, 0, 
      0, 1, 0, 1, 
      0, 0, 1, 0, 
      0, 0, 0, 1 } ; 
    Mat transitionMatrix=new Mat(4,4,CvType.CV_32F,new Scalar(0)); 
    transitionMatrix.put(0,0,tM); 
    kalman.set_transitionMatrix(transitionMatrix); 
    //set init measurement 
    Mat measurementMatrix = new Mat (2,1, CvType.CV_32F); 
    measurementMatrix.setTo(new Scalar(0)); 
    kalman.set_measurementMatrix(measurementMatrix); 

    //Set state matrix 
    Mat statePre = new Mat(4,1, CvType.CV_32F); 
    statePre.put(1, 1, 300); 
    statePre.put(2, 1, 200); 
    statePre.put(3, 1, 0); 
    statePre.put(4, 1, 0); 
    kalman.set_statePre(statePre); 


    //Process noise Covariance matrix 
    Mat processNoiseCov=Mat.eye(4,4,CvType.CV_32F); 
    processNoiseCov=processNoiseCov.mul(processNoiseCov,1e-1); 
    kalman.set_processNoiseCov(processNoiseCov); 

    //Measurement noise Covariance matrix: reliability on our first measurement 
    Mat measurementNoiseCov=Mat.eye(4,4,CvType.CV_32F); 
    measurementNoiseCov=measurementNoiseCov.mul(measurementNoiseCov,1e-1); 
    kalman.set_measurementNoiseCov(measurementNoiseCov); 

    Mat id2=Mat.eye(4,4,CvType.CV_32F); 
    id2=id2.mul(id2,0.1); 
    kalman.set_errorCovPost(id2); 

Pour chaque image vidéo:

prediction= kalman.predict(); 
    predictPt.x = prediction.get(1,1)[0]; 
    predictPt.y = prediction.get(2,1)[0]; 

.. La nouvelle mesure ..

measurementMatrix.put(1, 1, center.x); 
    measurementMatrix.put(2, 1, center.y); 
    measPt.x=center.x; 
    measPt.y=center.y; 

    Mat estimated = kalman.correct(measurementMatrix); 
    statePt.x=estimated.get(1, 1)[1]; 
    statePt.y= estimated.get(2, 1)[1]; 

Le problème est que je reçois une prédiction nulle, et je ne vois pas la raison pour obtenir il. Est-ce que quelqu'un sait ce qui ne va pas avec mon code? J'apprécie vraiment toute aide!

Merci!

Répondre

0

Vous obtenez une prédiction nulle car vous n'insérez pas et n'accédez pas aux éléments corrects.

Première:

statePre.put(0, 1, 300); //statePre.put(1, 1, 300); 
statePre.put(1, 1, 200); //statePre.put(2, 1, 200); 
statePre.put(2, 1, 0); //statePre.put(3, 1, 0); 
statePre.put(3, 1, 0); // statePre.put(4, 1, 0); 

Prédire:

prediction= kalman.predict(); 
predictPt.x = prediction.get(0,0)[0]; //predictPt.x = prediction.get(1,1)[0]; 
predictPt.y = prediction.get(1,0)[0]; //predictPt.y = prediction.get(2,1)[0]; 

Et enfin:

measurementMatrix.put(0, 0, center.x); // measurementMatrix.put(1, 1, center.x); 
measurementMatrix.put(1, 0, center.y); //measurementMatrix.put(2, 1, center.y); 
measPt.x=center.x; 
measPt.y=center.y; 

Mat estimated = kalman.correct(measurementMatrix); 
statePt.x=estimated.get(0,0)[0]; 
statePt.y= estimated.get(1,0)[0]; 

En outre, votre measurementMatrix devrait être comme ça

Mat measurementMatrix = Mat.eye(2,4, CvType.CV_32F);