2016-09-28 3 views
0
C++

Initialisation:Kalman Filter en utilisant OpenCV et

p->kalman_filter = new cv::KalmanFilter(state_dim, measurement_dim, 0); 
    p->kalman_filter->transitionMatrix = *(cv::Mat_<float>(state_dim, state_dim) 
                << 1,0,1,0, 0,1,0,1, 
                0,0,TIME_DIFFERENCE,0, 
                0,0,0,TIME_DIFFERENCE); 
    setIdentity(p->kalman_filter->measurementMatrix); 
    setIdentity(p->kalman_filter->processNoiseCov, cv::Scalar::all(1e-4)); 
    setIdentity(p->kalman_filter->measurementNoiseCov, cv::Scalar::all(1e-1)); 
    setIdentity(p->kalman_filter->errorCovPost, cv::Scalar::all(.1)); 

TIME_DIFFERENCE est constante.

cv::Mat new_state; 
    track t = p->tracks.at(track_id); 

    cv::transpose((cv::Mat)t.estimated_state, p->kalman_filter->statePost); 
    t.estimated_error_covariance.copyTo(p->kalman_filter->errorCovPost); 

    new_state = p->kalman_filter->predict(); 

Le code se bloque à prédire, l'erreur provenant de statePre = transitionMatrix*statePost; dans la fonction prédire(). L'erreur est due à l'échec de l'assertion pour le type. J'utilise transpose comme le t.estimated_state est la transposition de ce que le statePost doit être défini. J'ai essayé d'utiliser convertTo() pour changer le type de l'état t.estimated_state.Using setTo() pour statePost ne fonctionne pas non plus.

Est-ce que quelqu'un pourrait indiquer où je vais mal?

Répondre

0

J'ai été capable de résoudre mon problème. Je devais définir le type du filtre de Kalman à CV_64FC1 car toutes les valeurs que je fournissais étaient de type double. J'ai aussi changé le Mat initialisant la transitionMatrix en type double. Ceci est mon code final

p->kalman_filter = new cv::KalmanFilter(state_dim, measurement_dim, 0, CV_64FC1); 
p->kalman_filter->transitionMatrix = *(cv::Mat_<double>(state_dim, state_dim) 
                << 1,0,1,0, 0,1,0,1, 
                0,0,TIME_DIFFERENCE,0, 
                0,0,0,TIME_DIFFERENCE);