web-dev-qa-db-fra.com

Comment convertir un type de variable Mat dans un type de variable IplImage dans OpenCV 2.0?

J'essaie de faire pivoter une image dans OpenCV.

J'ai utilisé ce code que j'ai trouvé ici sur Stack Overflow:

Mat source(img);
Point2f src_center(source.cols/2.0, source.rows/2.0);
Mat rot_mat = getRotationMatrix2D(src_center, 40.0, 1.0);
Mat dst;
warpAffine(source, dst, rot_mat, source.size());

Une fois mon type de variable dstMat rempli, j'aimerais le remettre dans un type de variable IplImage. Avez-vous une idée de la façon de procéder?

12
Spredzy

Dans la nouvelle interface OpenCV 2.0 C++, il n'est pas vraiment nécessaire de passer de Mat à IplImage, mais si vous le souhaitez, vous pouvez utiliser l'opérateur IplImage:

IplImage dst_img = dst;

Notez que seul l'en-tête IplImage est créé et que les données (pixels) seront partagées. Pour plus d'informations, voir l'interface OpenCV C++ ou l'exemple image.cpp dans le répertoire OpenCV-2.0/samples/c.

17
jeff7

Pour avoir tout l'objet IplImage, j'ai utilisé ce code:

Mat matImage;
IplImage* iplImage;

iplImage = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
iplImage->imageData = (char *) matImage.data;

Vous pouvez également copier les données à la place du pointeur:

memcpy(iplImage->imageData, matimage.data, 640*480);
15
lumapu

Norman dans son blog décrit ce qui suit (bien qu'il ne s'agisse pas de la version 2.0, il devrait s'appliquer à votre problème.):

Pour transformer de CvMat en IplImage, utilisez la fonction:

IplImage* cvGetImage( const CvArr* arr, IplImage* image_header );  

La fonction cvGetImage retourne l'en-tête de l'image pour le tableau d'entrée qui peut être matrice - CvMat * ou image - IplImage *. Dans le cas d'une image, la fonction renvoie simplement le pointeur d'entrée. Dans le cas de CvMat *, il initialise la structure image_header avec les paramètres de la matrice d'entrée. Usage:

IplImage stub, *dst_img;
dst_img = cvGetImage(src_mat, &stub);
1
rics

Dans les versions ultérieures d’OpenCV 2.4 et versions ultérieures, nous pouvons le convertir simplement en:

cv::Mat inMat;
//do the stuffs
IplImage* outIPL = (IplImage*)(&IplImage(inMat));
0
Vinoj John Hosan