La documentation à ce sujet semble incroyablement inégale.
J'ai en gros un tableau vide d'IplImage * s (IplImage ** imageArray) et j'appelle une fonction pour importer un tableau de cv :: Mats - Je souhaite convertir mon cv :: Mat en un IplImage * peut le copier dans le tableau.
Actuellement j'essaye ceci:
while(loop over cv::Mat array)
{
IplImage* xyz = &(IplImage(array[i]));
cvCopy(iplimagearray[i], xyz);
}
Ce qui génère une erreur de segmentation.
Essayant aussi:
while(loop over cv::Mat array)
{
IplImage* xyz;
xyz = &array[i];
cvCopy(iplimagearray[i], xyz);
}
Ce qui me donne une erreur de compilation de: error: cannot convert ‘cv::Mat*’ to ‘IplImage*’ in assignment
Stuck quant à la façon dont je peux aller plus loin et apprécierais quelques conseils :)
cv::Mat
est le nouveau type introduit dans OpenCV2.X alors que IplImage*
est la structure d'image "héritée".
Bien que cv::Mat
prenne en charge l'utilisation de IplImage
dans les paramètres du constructeur, la bibliothèque par défaut ne fournit pas de fonction dans l'autre sens. Vous devrez extraire manuellement les informations de l'en-tête de l'image. (N'oubliez pas que vous devez attribuer la structure IplImage, qui manque dans votre exemple).
Mat image1;
IplImage* image2=cvCloneImage(&(IplImage)image1);
Je suppose que ça va faire le travail.
Edit: Si vous faites face à des erreurs de compilation, essayez ceci:
cv::Mat image1;
IplImage* image2;
image2 = cvCreateImage(cvSize(image1.cols,image1.rows),8,3);
IplImage ipltemp=image1;
cvCopy(&ipltemp,image2);
(you have cv::Mat old)
IplImage copy = old;
IplImage* new_image = ©
vous travaillez avec new en tant que IplImage * initialement déclaré.
Personnellement, je pense que ce n'est pas le problème causé par le transtypage, mais un problème de débordement de mémoire tampon; c'est cette ligne
cvCopy(iplimagearray[i], xyz);
que je pense va causer une erreur de segment, je vous suggère de confirmer que le tableau iplimagearray [i] a une taille de mémoire tampon suffisante pour recevoir les données copiées
Selon OpenCV cheat-sheet , cela peut être fait comme suit:
IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1);
Mat newC = cvarrToMat(oldC0);
La fonction cv :: cvarrToMat prend en charge les problèmes de conversion.
L’un des problèmes peut être: lorsqu’on utilise ipl externe et que l'on définit HAVE_IPL dans votre projet, le ctor
_IplImage::_IplImage(const cv::Mat& m)
{
CV_Assert( m.dims <= 2 );
cvInitImageHeader(this, m.size(), cvIplDepth(m.flags), m.channels());
cvSetData(this, m.data, (int)m.step[0]);
}
trouvé dans ../OpenCV/modules/core/src/matrix.cpp n'est pas utilisé/instancié et la conversion échoue.
Vous pouvez le réimplémenter de la manière suivante:
IplImage& FromMat(IplImage& img, const cv::Mat& m)
{
CV_Assert(m.dims <= 2);
cvInitImageHeader(&img, m.size(), cvIplDepth(m.flags), m.channels());
cvSetData(&img, m.data, (int)m.step[0]);
return img;
}
IplImage img;
FromMat(img,myMat);
En cas d'image grise, j'utilise cette fonction et cela fonctionne bien! Cependant, vous devez faire attention aux fonctionnalités;)
CvMat * src= cvCreateMat(300,300,CV_32FC1);
IplImage *dist= cvCreateImage(cvGetSize(dist),IPL_DEPTH_32F,3);
cvConvertScale(src, dist, 1, 0);