2016-01-28 2 views
0

J'ai essayé de travailler sur le suivi de plusieurs objets en utilisant Kalman Filter. Voici mon code,opencv Kalman filtre erreur de suivi d'objet multiple

for (int i =0; i<vGlobal.size(); i++) // Vector of objects of interest 
    { 
     cv::Point pTemp = cv::Point(vGlobal[i].iX, vGlobal[i].iY); 
     cv::KalmanFilter kTempKF(4,2,0); 
     kTempKF.statePre.at<floatt>(0) = pTemp.x; 
     kTempKF.statePre.at<float>(1) = pTemp.y; 
     kTempKF.statePre.at<float>(2) = 0; 
     kTempKF.statePre.at<float>(3) = 0; 

     kTempKF.transitionMatrix = *(cv::Mat_<float>(4,4)<< 1,0,1,0, 0,1,0,1, 0,0,1,0, 0,0,0,1); 
     cv::setIdentity(kTempKF.measurementMatrix); 
     cv::setIdentity(kTempKF.processNoiseCov, cv::Scalar::all(1e-4));    
     cv::setIdentity(kTempKF.measurementNoiseCov, cv::Scalar::all(10)); 
     cv::setIdentity(kTempKF.errorCovPost, cv::Scalar::all(.1)); 
     vKalmanFilters.push_back(kTempKF); 
    } 

J'utilise le vecteur des filtres de Kalman pour suivre chacun de mes objets. J'ai fait l'initialisation des filtres comme ci-dessus. Maintenant, j'essaie de travailler sur la prédiction et la mesure comme suit dans le code ci-dessous.

for (int i=0; i<vKalmanFilters.size();i++) 
    { 
     cv::Mat mPrediction = vKalmanFilters[i].predict(); 

     cv::Point pPredict(mPrediction.at<float>(0), mPrediction.at<float>(1)); 
     mMeasurement(0) = vGlobal[i].iX; 
     mMeasurement(1) = vGlobal[i].iY; 


     cv::Mat mEstimated; 


      mEstimated = vKalmanFilters[i].correct(mPrediction); // Run time Error occurs here 


    } 

Lorsque je tente d'exécuter ce programme, je reçois une erreur d'exécution dans le bon (prédiction)

OpenCV Error: Assertion failed (C.type() == type && (((flags&GEMM_3_T) == 0 && C.rows == d_size.height && C.cols == d_size.width) || ((flags&GEMM_3_T) != 0 && C.rows == d_size.width && C.cols == d_size.height))) in gemm, file /build/buildd/opencv-2.4.8+dfsg1/modules/core/src/matmul.cpp, line 741 
terminate called after throwing an instance of 'cv::Exception' 
what(): /build/buildd/opencv-2.4.8+dfsg1/modules/core/src/matmul.cpp:741: error: (-215) C.type() == type && (((flags&GEMM_3_T) == 0 && C.rows == d_size.height && C.cols == d_size.width) || ((flags&GEMM_3_T) != 0 && C.rows == d_size.width && C.cols == d_size.height)) in function gemm 

Je suis encore un débutant dans le filtre de Kalman. L'erreur se produit au point de prédiction. Est-ce que mon approche est totalement fausse? S'il vous plaît, quelqu'un explique où je me trompe.

+2

matrices doivent être 'float' (CV_32F) ou 'double' (CV_64F), pas' int' – Berriel

+0

@Berriel: Oui, cela a fonctionné. Mais maintenant (comme récemment modifié), une erreur d'exécution différente se produit à l'étape correcte (prédiction), que j'ai ajouté maintenant. –

Répondre

2

Vous devez utiliser mMeasurement (matrice 2x1) au lieu de mPrediction (matrice 4x1) dans le correction step:

mEstimated = vKalmanFilters[i].correct(mMeasurement); 

Étant donné que vous avez fait:

cv::KalmanFilter kTempKF(4,2,0); 
// 4 dynamic params <-- your state, e.g. [x y dx dy] 
// 2 measurements params <-- your mMeasurement [x y] 
+0

Comment puis-je utiliser la prédiction alors? Je pensais que la prédiction devrait également donner la matrice 2x1. On m'a dit que s'il n'y a pas de mesure, la prédiction sera la solution. Donc, la prédiction donne aussi le même type de valeur que la mesure. Comment obtenir les valeurs prédites s'il n'y a pas de valeurs de mesure? C'est ma question. –

+0

Si cette réponse résout votre problème, s'il vous plaît accepter ou upvote it. À propos de votre doute, KalmanFilter utilise une mesure dans l'étape de correction, qui met à jour l'état prévu en fonction de cette mesure. En cas de mesure manquante, c'est à vous de décider. Parfois, les gens utilisent le dernier état prédit pour 'corriger()', mais avant cela, je vous conseille de comprendre ce qui se passe réellement, mathématiquement. Aussi, dans ce cas, l'état est 4x1 et vous avez juste besoin des 2 premiers à utiliser comme "mesure". – Berriel

+0

salut, cela ne fonctionne pas pour moi. Je me trompe de valeurs estimées. Cependant, si je déclare l'objet KalmanFilter globalement, j'obtiens une valeur estimée correcte et cela aussi si je n'ai qu'un seul blob. Si j'ai deux blobs, j'obtiens deux mêmes valeurs estimées au centre des deux blobs. Comment est-ce que je ferais les valeurs estimées pour suivre leur blob respectif? pourrais-tu m'aider s'il te plaît. – MaheshKumar