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

OpenCV Discussion :

Problème avec cvStereoRectify


Sujet :

OpenCV

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 25
    Par défaut Problème avec cvStereoRectify
    Bonjour,

    Jusqu'à maintenant l'ensemble des posts de ce forum m'a bien aidé mais la je suis bloqué.

    J'essaye de faire de la 3D avec deux caméras comme beaucoup de monde .

    J'ai donc crée une fonction qui récupère tous les paramètre d'une caméra : matrice intrinsèque, coefficients de distorsion, matrice de rotation, matrice de translation. Je récupère aussi les points de l'image et les points de l'objet.

    J'applique cette fonction pour chaque caméra et ensuite je me sers de ces informations pour faire de la stéréo.

    J'ai donc commencé par faire une calibration stéréo avec cvStereoCalibrate.
    Jusqu'ici tout marche.

    C'est au moment de la rectification que je ne comprends pas ce qui se passe.

    J'appelle la fonction cvStereoRectify et j'obtiens ceci en sortie :



    voici mon code :

    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
    int main(int argc, char* argv)
    {
    remove("rotation_out.xml");
    	remove( "translation_out.xml");
    	remove( "essential_out.xml");
    	remove("fundamental_out.xml");
     
     
    	CvCapture* capture_g= cvCreateFileCapture("video_g.avi");
    	CvSize size_g = parametre_camera(capture_g,"calibration_g","undistort_g","intrinsic_g.xml","distortion_g.xml","rotation_g.xml","translation_g.xml","point_image_g.xml","point_objet_g.xml","count_obj_g.xml");
     
    	CvCapture* capture_d= cvCreateFileCapture("video_d.avi");
    	CvSize size_d = parametre_camera(capture_d,"calibration_d","undistort_d","intrinsic_d.xml","distortion_d.xml","rotation_d.xml","translation_d.xml","point_image_d.xml","point_objet_d.xml","count_obj_d.xml");
     
     
        CvMat* rotation_output    = cvCreateMat( 3, 3, CV_64F);
    	CvMat* rotation_vec =cvCreateMat(3,1,CV_32FC1);
    	CvMat* essential_output     = cvCreateMat( 3, 3, CV_32FC1 );
     
    	CvMat* fundamental_output     = cvCreateMat( 3, 3, CV_32FC1 );
     
     
    	CvMat* rotation_rectify_g    = cvCreateMat( 3, 3, CV_32FC1 );
    	CvMat* rotation_rectify_d    = cvCreateMat( 3, 3, CV_32FC1 );
     
    	CvMat* projection_rectify_g    = cvCreateMat( 3, 4, CV_32FC1 );
    	CvMat* projection_rectify_d    = cvCreateMat( 3, 4, CV_32FC1 );
     
    	CvMat* translation_output   = cvCreateMat( 3, 1, CV_32FC1 );
     
     
    	CvMat* rotation_matrix_g  = (CvMat*)cvLoad( "rotation_g.xml" );
    	CvMat* rotation_matrix_d  = (CvMat*)cvLoad( "rotation_d.xml" );
     
    	CvMat* intrinsic_matrix_g = (CvMat*)cvLoad("intrinsic_g.xml");
    	CvMat* intrinsic_matrix_d = (CvMat*)cvLoad("intrinsic_d.xml");
     
    	CvMat* distortion_matrix_g    = (CvMat*)cvLoad( "distortion_g.xml" );
    	CvMat* distortion_matrix_d    = (CvMat*)cvLoad( "distortion_d.xml" );
     
    	CvMat* translation_matrix_g   =  (CvMat*)cvLoad( "translation_g.xml" );
    	CvMat* translation_matrix_d   =  (CvMat*)cvLoad( "translation_d.xml" );
     
    	CvMat* point_image_g   = (CvMat*)cvLoad( "point_image_g.xml" ); 
    	CvMat* point_image_d   = (CvMat*)cvLoad( "point_image_d.xml" );
     
    	CvMat* point_objet   = (CvMat*)cvLoad( "point_objet_g.xml" );
     
    	CvMat* count_objet_g   = (CvMat*)cvLoad( "count_obj_g.xml" );
    	CvMat* count_objet_d   = (CvMat*)cvLoad( "count_obj_d.xml" );
     
    	cvStereoCalibrate(point_objet,point_image_g,point_image_d,count_objet_g,intrinsic_matrix_g,distortion_matrix_g,intrinsic_matrix_d,distortion_matrix_d,size_g,rotation_output,translation_output,essential_output,fundamental_output,cvTermCriteria(1+2,30,0.000001),CV_CALIB_USE_INTRINSIC_GUESS);
     
    	cvSave( "rotation_out.xml", rotation_output );
    	cvSave( "translation_out.xml",translation_output);
    	cvSave( "essential_out.xml", essential_output );
    	cvSave( "fundamental_out.xml",fundamental_output );
     
     
     
    	CvMat* disparity_rectify    = cvCreateMat( 4, 4, CV_32FC1 );
     
    	cvStereoRectify(intrinsic_matrix_g,intrinsic_matrix_d,distortion_matrix_g,distortion_matrix_d,size_g,rotation_output,translation_output,rotation_rectify_g,rotation_rectify_d,projection_rectify_g,projection_rectify_d,0,0);
     
     
    	return 0;
     
    }
    J'y suis allé au debugueur, je crois que le problème traine près de la matrice rotation_output. J'ai d'ailleurs essayé de changer son format en CV_64F car lors de cvStereoRectify il y a appel de cvRodrigues2 qui demande que les deux matrices pour la conversion soit de même type...
    En tout cas si je change pas le format de rotation_output il me met l'erreur : formats of input/output arrays differ


    J'ai plus trop d'idée...besoin d'aide... Merci!


    Je suis sous Visual C++ 2008 avec OpenCV 2.0 sous windowsXP

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 25
    Par défaut
    Je pense avoir trouvé :

    Dans toutes mes déclarations de matrice j'ai mis le type CV_64F...

    Je crois que ça correspond au double, en tout cas j'ai jamais trop compris la différence entre CV_64FC1, CV_64FC2 et CV_64F...

    Bref en mettant le même type partout il ne met plus d'erreur (j'ai vu ça dans l'exemple dans openCV sur la calibration qu'il mettait tout dans le format double...) alors après pourquoi?? c'est une autre question

  3. #3
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    CV_32 c'est du float et si tu manipule du float avec du double ou l'inverse c'est normal qu'il apprécie pas =)

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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