Bonjour, je suis actuellement en train de travailler avec un système Stéréo Vision et je suis confronté à une erreur lorsque j'utilise cvRemap.

Voici des bouts de codes :

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
// Constantes
#define h 480
#define w 640
 
IplImage* imgD_temp = cvCreateImage(cvSize(w,h),8,3); // Image originale camera droite
IplImage* imgG_temp = cvCreateImage(cvSize(w,h),8,3); // Image originale camera gauche
IplImage* imgD = cvCreateImage(cvSize(w,h),8,3);  // Image corrigee camera droite
IplImage* imgG = cvCreateImage(cvSize(w,h),8,3);// Image corrigee camera gauche
 
// Préparation flux vidéo
CvCapture *camDroite = cvCreateCameraCapture(0);
cvSetCaptureProperty(camDroite, CV_CAP_PROP_FRAME_WIDTH,640 );
cvSetCaptureProperty(camDroite, CV_CAP_PROP_FRAME_HEIGHT,480 );
CvCapture *camGauche = cvCreateCameraCapture(1);
cvSetCaptureProperty(camGauche, CV_CAP_PROP_FRAME_WIDTH,640 );
cvSetCaptureProperty(camGauche, CV_CAP_PROP_FRAME_HEIGHT,480 );
 
CvMat *mxD = (CvMat *)cvLoad("mx2.xml",NULL,NULL,NULL);
CvMat *myD = (CvMat *)cvLoad("my2.xml",NULL,NULL,NULL);
 
while(key != 'q' && key != 'Q') // Tant que l'utilisateur n'appuie pas sur Q
	{
 
	   cvGrabFrame(camDroite); // On enregistre la capture dans le buffer
	   cvGrabFrame(camGauche); // On enregistre la capture dans le buffer
 
	   // On récupère une image
           IplImage *frameD = cvCloneImage(cvRetrieveFrame(camDroite));
           IplImage *frameG = cvCloneImage(cvRetrieveFrame(camGauche));
 
           imgD_temp = cvCloneImage(frameD);
           imgG_temp = cvCloneImage(frameG);
 
           cvRemap(imgD_temp, imgD, mxD, myD);
          }
Voici le code d'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
OpenCV Error: Assertion failed (src.type() == dst.type() && dst.size() == mapx.size()) in unknow function, file imgwarp.cpp, line 3247

Si j'enlève le cvRemap, le code fonctionne.

Je précise également que les fichiers mxD et myD sont bien de la même taille que mon image, c'est à dire 640*480 et ont été enregistrés lors d'une calibration de cette manière :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
CvMat* mx1 = cvCreateMat(imageSize.height,imageSize.width,CV_32F );
CvMat* my1 = cvCreateMat( imageSize.height,imageSize.width, CV_32F );
cvInitUndistortRectifyMap(&_M2,&_D2,&_R2,&_P2,mx2,my2);
cvSave("mx2.xml",mx2);
cvSave("my2.xml",my2);
.

De plus, si je me réfère au livre Learning OpenCV il est indiqué :
The first two arguments of cvRemap() are the source and destination images, respectively. Obviously, these should be of the same size and number of channel, but they can have any data type. It is important to note that the two may not be the same image. The next two arguments, mapx and mapy, indicate where any particular pixel is to be relocated.
These should be the same size as the source and destination images, but they are single-channel and usually of data type float (IPL_DEPTH_32F).
Si je me réfère à cette explication, j'ai donc bien mon image source et mon image de destination de même dimension (640*480), et ayant le même nombre de channel (3). Aussi, mes mapx et mapy (ici mx2 et my2 sont bien des CV_32F).

Merci pour votre aide

Cordialement