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 dst
Mat
rempli, j'aimerais le remettre dans un type de variable IplImage
. Avez-vous une idée de la façon de procéder?
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
.
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);
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);
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));