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 :

Estimation de pose par homographie sur OpenCV


Sujet :

Traitement d'images

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Points : 59
    Points
    59
    Par défaut Estimation de pose par homographie sur OpenCV
    Bonjour,

    Pour faire suite au post :
    http://www.developpez.net/forums/d13...timation-pose/

    J'ai essayé d'utiliser cette algorithme (avec ma propre implémentation OpenCV) sur une vidéo "idéal" (photoshop) de translation horizontal :

    Et je n'obtiens clairement pas de bon résultats : ma matrice t vaut [-1445 -1738 2433] ...

    H vaut [ 0.9988 -0.001 900 ; 0.0002 0.9998 -0.056 ; 1.65e-008 -6.87 1] cela vous semble juste ? (utilisation de findHomography

    voici mon code :

    Code C++ : 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
    		Mat H = findHomography(initial,points[0],CV_LMEDS);  // j'ai essayé avec ransac également
     
    		Mat Hc;
     
    		Mat h1 = Mat::zeros(3, 1, CV_64F);
    		Mat h2 = Mat::zeros(3, 1, CV_64F);
    		Mat h3 = Mat::zeros(3, 1, CV_64F);
     
    		h1.at<double>(0,0) = H.at<double>(0,0);
    		h1.at<double>(1,0) = H.at<double>(1,0);
    		h1.at<double>(2,0) = H.at<double>(2,0);
     
    		h2.at<double>(0,0) = H.at<double>(0,1);
    		h2.at<double>(1,0) = H.at<double>(1,1);
    		h2.at<double>(2,0) = H.at<double>(2,1);
     
    		h3.at<double>(0,0) = H.at<double>(0,2);
    		h3.at<double>(1,0) = H.at<double>(1,2);
    		h3.at<double>(2,0) = H.at<double>(2,2);
     
    		Hc = Intrin.inv()*H;
     
     
    		double l1 = 1/norm(Intrin.inv()*h1);
    		double l2 = 1/norm(Intrin.inv()*h2);
     
    		Mat t = (l1/2+l2/2)*Intrin.inv()*h3;
     
    		cout << "t = " << endl << " " << t << endl << endl;
     
    		Mat r1 = (l1/2+l2/2)*Intrin.inv()*h1;
    		Mat r2 = (l1/2+l2/2)*Intrin.inv()*h2;
    		Mat r3 = Mat::zeros(3, 1, CV_64F);
     
    		//cvCrossProduct(r1,r2,r3);
     
    		r3=r1.cross(r2);
     
    		Mat R = Mat::zeros(3, 3, CV_64F);
     
    		R.at<double>(0,0)= r1.at<double>(0,0);	R.at<double>(0,1)= r2.at<double>(0,0);	R.at<double>(0,2)= r3.at<double>(0,0);
    		R.at<double>(1,0)= r1.at<double>(1,0);	R.at<double>(1,1)= r2.at<double>(1,0);	R.at<double>(1,2)= r3.at<double>(1,0);
    		R.at<double>(2,0)= r1.at<double>(2,0);	R.at<double>(2,1)= r2.at<double>(2,0);	R.at<double>(2,2)= r3.at<double>(2,0);
     
     
    		Mat  W, U, V;
    		SVD::compute(R, W, U, V,SVD::FULL_UV);
     
    		Mat Rc = U*V.t();
     
    		cout << "Rc = " << endl << " " << Rc << endl << endl;


    et merci pour vos idée

    Cordialement,

    Ronan

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut
    Bonsoir,

    En fait le type d'homographie issue de ton image doit avoir idealement cette forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        | a11 a12 tx|
    H = | a21 a22 ty|
        | 0   0  1  |
    SI on a A = [a11 a12; a21 a23] , tx et ty sont les déplacement de ton image.
    Idéalement A devrait être égale une matrice identité de dimension 2.
    Cette matrice A contient un facteur d'echelle sur l'axe x et x mais aussi des déformations et une matrice de rotation.

    Je vous conseille de livre :
    http://www.robots.ox.ac.uk/~vgg/hzbook/

    Vous pourrez y trouver des informations plus complete.

    @++

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    entre temps j'ai croisé le très bon "Multiple View Geometry in Computer Vision" où tout est expliqué

    mon problème était que je voulais un mouvement 3D en fait et je pensais pouvoir obtenir quelques descriptions de mouvements 3D à partir d'une homographie 2D.

    Tout est bien expliqué dans le livre

    Merci pour votre réponse

    Ronan

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

Discussions similaires

  1. Homographie et estimation de pose
    Par black_hole dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 29/05/2013, 11h11
  2. Réponses: 2
    Dernier message: 09/04/2013, 09h00
  3. Estimation de mouvement par homographie
    Par black_hole dans le forum Traitement d'images
    Réponses: 0
    Dernier message: 13/06/2011, 17h34
  4. Réponses: 0
    Dernier message: 22/04/2011, 22h25
  5. [CR8.5] Problème de division par zéro sur formule
    Par franck.cvitrans dans le forum Formules
    Réponses: 3
    Dernier message: 10/06/2004, 13h41

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