IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Traitement d'images Discussion :

matrice fondamentale: algorithme des 8 points et normalisation


Sujet :

Traitement d'images

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Par défaut matrice fondamentale: algorithme des 8 points et normalisation
    Bonjour tout le monde

    Est ce que quelqu'un pourrait m'expliquer comment normaliser les points dans l'algorithme des 8-points pour l'estimation de la matrice fondamentale? car, j'ai lu la section qui lui est consacrée dans le livre de Harteley, et j'ai implémenté cette méthode, sauf que le résultat n'est pas beau à voir, j'obtiens une matrice de l'ordre de 10^65!!

    j'ai un deadline pour la fin de cette semaine et je suis toujours bloquée au niveau de ce point

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    J'ai un cours sur ça.

    Pour la normalisation de Hartley voici les formules :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Pn = T*P
     
    avec P = (x,y,1)^t
     
    T = (a 0 -a*u)
          (0 a -a*v)
          (0 0   1  )
     
    et :
     
    u = moyenne des abscisses
    v = moyenne des ordonnées
    a = sqrt(2) / moyenne de la norme des points soustraits par leur centre de gravité (u,v)
    Ca te donne tes points normalisés Pn. Une fois la matrice normalisée F (qui d'associer un point de l'image de gauche sa droite épipolaire dans l'image de droite) calculée pense à dénormaliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    F = T^dt * F * T^g
     
    où T^dt est la matrice qui permet de normaliser les points de l'image de droite transposée
    T^g matrice qui normalise les points de l'image de gauche
    Voilou.

    PS : la matrice F n'est pas forcément de rang 2. Une solution est de trouver la matrice de rang 2 la plus proche au sens de la norme de Frobenius (http://en.wikipedia.org/wiki/Frobeni...Frobenius_norm). Pour cela décomposition en valeur singuliere de F :

    F = USV^t où S = diag(r1,r2,r3) tels que r1 >= r2 >= r3

    Ce que tu veux c'est F = U*S'*V^t avec S' = diag(r1,r2,0)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 126
    Par défaut
    Bonjour,
    Merci beaucoup pour la réponse
    c'est exactement ce que j'ai implémenté, sauf que ça me donne une matrice bien loin de la solution
    Je mets le code que j'ai écrit pour l'estimation de la matrice fondamentale, s'il y' a quelqu'un qui pourrait voir le résultat, car, il me semble que j'ai une erreur bête qui m'échappe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     C++
    //8+ algorithm for fondamental matrix estimation
    //points[i]=(x_i, x^'_i) the matched points by SIFT
    		Matrix<double> Fond(3,3);
    		Matrix<double> A(8,9);
    		Matrix<double> T1(3,3),T2(3,3);
    		//First step : Normalisation
    		double S1=0,S2=0, Tx1=0, Tx2=0, Ty1=0, Ty2=0;
    		//calculate the translation terms as the centroide of the 8-set points become the origin
    		for(int i=0;i<8;i++)
    			{
    				Tx1+=points(i)->at(0);
    				Ty1+=points(i)->at(1);
    				Tx2+=points(i)->at(2);
    				Ty2+=points(i)->at(3);
    			}
    		Tx1/=8;
    		Ty1/=8;
    		Tx2/=8;
    		Ty2/=8;
     
    		//the scaling parameters computing
    		for(int i=0;i<8;i++)
    			{
    				S1+=sqrt((points(i)->at(0)-Tx1)*(points(i)->at(0)-Tx1)+(points(i)->at(1)-Ty1)*(points(i)->at(1)-Ty1));
    				S2+=sqrt((points(i)->at(2)-Tx2)*(points(i)->at(2)-Tx2)+(points(i)->at(3)-Ty2)*(points(i)->at(3)-Ty2));
    			}
    		S1/=8;
    		S2/=8;
    		S1=sqrt(double(2))/S1;
    		S2=sqrt(double(2))/S2;
     
     
    		//preparing the transofrmation matrices T1 et T2'
    		T1[0*3+0]=S1;     T1[0*3+1]=0;      T1[0*3+2]=-S1*Tx1;
    		T1[1*3+0]=0;      T1[1*3+1]=S1;     T1[1*3+2]=-S1*Ty1;
    		T1[2*3+0]=0;      T1[2*3+1]=0;      T1[2*3+2]=1;
     
    		T2[0*3+0]=S2;     T2[0*3+1]=0;      T2[0*3+2]=0;
    		T2[1*3+0]=0;      T2[1*3+1]=S2;     T2[1*3+2]=0;
    		T2[2*3+0]=-S2*Tx2; T2[2*3+1]=-S2*Ty2; T2[2*3+2]=1;
     
    		//Linear system construction
    		for(int i=0;i<8;i++)
    			{//fill the A'i° ligne with the relation P2t*F*P1=0;
    			A[i*9]  =(S2*(points(i)->at(2)-Tx2))*(S1*(points(i)->at(0)-Tx1));
    			A[i*9+1]=(S2*(points(i)->at(2)-Tx2))*(S1*(points(i)->at(1)-Ty1));
    			A[i*9+2]=S2*(points(i)->at(2)-Tx2);
     
    			A[i*9+3]=(S2*(points(i)->at(3)-Ty2))*(S1*(points(i)->at(0)-Tx1));
    			A[i*9+4]=(S2*(points(i)->at(3)-Ty2))*(S1*(points(i)->at(1)-Ty1));
    			A[i*9+5]=S2*(points(i)->at(3)-Ty2);
     
    			A[i*9+6]=S1*(points(i)->at(0)-Tx1);
    			A[i*9+7]=S1*(points(i)->at(1)-Ty1);
    			A[i*9+8]=1;
    			}
    		//F estimation matrix with SVD decomposition
     
    		Vector<double> s;
    		Matrix<double> U,Vt;
    		A.svda(U,s,Vt);	// A=U.S.Vt with diag(S)=s (all SVD)
    		//F est la dernière ligne de Vt
    		Fond[0*3+0]=Vt[8*9+0];	Fond[0*3+1]=Vt[8*9+1];	Fond[0*3+2]=Vt[8*9+2];
    		Fond[1*3+0]=Vt[8*9+3];	Fond[1*3+1]=Vt[8*9+4];	Fond[1*3+2]=Vt[8*9+5];
    		Fond[1*3+0]=Vt[8*9+6];	Fond[1*3+1]=Vt[8*9+7];	Fond[1*3+2]=Vt[8*9+8];
     
    		//enforce the matrix Fond to have rank 2
    		Fond.svda(U,s,Vt);
    		Matrix<double> S(3,3);
    		S[0]=s[0]; S[1]=0;    S[2]=0;
    		S[3]=0;    S[4]=s[1]; S[5]=0;
    		S[6]=0;    S[7]=0;    S[8]=0;
    		Fond=U*S*Vt;
    		//denormalize the fondamentale matrix
    		Fond=T2*Fond*T1;
    Encore une fois, merci pour vos réponses

    Note:
    finalement, ça marche, c'était plutôt une histoire d'indices mal placés, car j'utilise une bibliothèque qui stocke les matrices de manière peu conventionnelle

    Note:
    Sorry, c'est plutôt la mauvaise habitude d'essayer à reformuler mes idées, mais sans effacer ce qui était écrit auparavant
    Encore une fois, mes excuses pour ces désagréments de la langue

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par MPEG4 Voir le message
    Note:
    finalement, ça marche, c'était plutôt une histoire d'indices mal placés, car j'utilise une bibliothèque qui ne stocke pas les matrices de manière peu conventionnelle
    attention à la double négation dans tes rapports

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] algorithme ou matrice pour déterminer des cellules entre deux cellules formant une plage
    Par patricktoulon dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 01/04/2013, 18h01
  2. algorithme des deux points les plus proches
    Par biba1980 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 10/11/2009, 04h18
  3. Algorithme zone de points sur une image
    Par Alain15 dans le forum 2D
    Réponses: 1
    Dernier message: 08/12/2006, 00h55
  4. Réponses: 1
    Dernier message: 29/11/2006, 12h00
  5. [3D] matrice de déformation pour un point de vue décalé
    Par mou013 dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 04/02/2006, 18h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo