Bonjour,
je souhaite filtrer le suivi d'un doigt. la position du doigt déterminé par traitement oscille avec une fréquence relativement rapide de quelque pixels autour de la position idéale.
j'utilise un filtre de kalman initialisé de la facon suivante :
m_kalman=cvCreateKalman(6,2,0);
float t=1.0/30.0;
const float F[6][6] =
{
{1, 0, t, 0 ,t*t/0.5 ,0},
{0, 1, 0, t , 0 ,t*t/0.5},
{0, 0, 1, 0 , t ,0},
{0, 0, 0, 1 , 0 ,t},
{0, 0, 0, 0 , 1 ,0},
{0, 0, 0, 0 , 0 ,1},
};
memcpy(m_kalman->transition_matrix->data.fl,F,sizeof(F));
cvSetIdentity(m_kalman->measurement_matrix,cvRealScalar(1));
cvSetIdentity(m_kalman->process_noise_cov,cvRealScalar(1e-5));
cvSetIdentity(m_kalman->measurement_noise_cov,cvRealScalar(1e-3)); /// importance du bruit
cvSetIdentity(m_kalman->error_cov_post,cvRealScalar(1));
m_kalman->state_pre->data.fl[0]=0.0f;
m_kalman->state_pre->data.fl[1]=0.0f;
m_kalman->state_pre->data.fl[2]=0.0f;
m_kalman->state_pre->data.fl[3]=0.0f;
m_kalman->state_pre->data.fl[4]=0.0f;
m_kalman->state_pre->data.fl[5]=0.0f;
x_k=cvCreateMat(6,1,CV_32FC1);
z_k=cvCreateMat(2,1,CV_32FC1);
cvZero(z_k);
cvZero(x_k);
-> J'ai utilisé un modele a accélération constante. Je ne sais pas comment ajuster les parametres de measurement_noise_cov et process_noise_cov pour arriver a filtrer les oscillations. soit je mets des coefficients faible : dans ce cas la il n'y a plus d'oscillation mais le suivi est trop a la traine, soit je mets des coefficients importants, le suivi est bon mais les oscillations sont trop importantes ....
pour l'instant je fais varier les coefficients avec cvSetIdentity : est ce que l'idée est d'ajuster les coefficients des matrices de covariances de bruits de maniere différente ? un coeff pour la position, un pour la vitesse, un pour l'accélération ?
merci d'avance
Kao
Partager