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