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 :
Voici le code d'erreur :
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); }
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é :
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).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).
Merci pour votre aide
Cordialement
Partager