2010-03-18 26 views
12

Estoy tratando de rotar una imagen en OpenCV.Cómo convertir un tipo de variable Mat en un tipo de variable IplImage en OpenCV 2.0?

He utilizado este código que he encontrado aquí en desbordamiento de pila:

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()); 

Una vez que tengo mi dstMat tipo de variable llenado quisiera poner de nuevo a un IplImage tipo de variable, alguna idea acerca de cómo hacer esto?

Respuesta

17

En el nuevo OpenCV 2.0 interfaz C++ en realidad no es necesario cambiar de ida y vuelta entre Mat y IplImage, pero si desea puede utilizar el IplImage operador:

IplImage dst_img = dst; 

Tenga en cuenta que solo se crea el encabezado IplImage y los datos (píxeles) se compartirán. Para obtener más información, consulte el ejemplo OpenCV C++ interface o el image.cpp en el directorio OpenCV-2.0/samples/c.

+0

¡Muchas gracias! ¡Funcionó! No pensé que podríamos manejarlo así. – Spredzy

1

Norman en his blog describe lo siguiente (Aunque no es 2.0, se debe aplicar a su problema.):

transformarse de CvMat a IplImage, utilice la función:

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

La función cvGetImage devuelve el encabezado de la imagen para la matriz de entrada que puede ser matriz - CvMat *, o imagen - IplImage *. En el caso de la imagen, la función simplemente devuelve el puntero de entrada. En el caso de CvMat * inicializa la estructura image_header con los parámetros de la matriz de entrada. Uso:

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

Para tener todo el IplImage objeto, he utilizado este código:

Mat matImage; 
IplImage* iplImage; 

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

También puede copiar los datos en lugar de puntero:

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

En versiones posteriores de OpenCV 2.4 y anteriores , podemos convertirlo simplemente por

cv::Mat inMat; 
//do the stuffs 
IplImage* outIPL = (IplImage*)(&IplImage(inMat)); 
Cuestiones relacionadas