web-dev-qa-db-fra.com

Conversion de cv :: Mat en IplImage *

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 :)

47
amr

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).

22
YeenFei
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);
18
William
 (you have cv::Mat old)
 IplImage copy = old;
 IplImage* new_image = ©

vous travaillez avec new en tant que IplImage * initialement déclaré.

11
user2103629

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

1
octavian

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.

0
chayan

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);
0
Timm

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);
0
ksolid