2011-01-12 24 views
43

La documentación sobre esto parece increíblemente irregular.Convirtiendo cv :: Mat a IplImage *

Básicamente tengo una matriz vacía de IplImage * s (IplImage ** imageArray) y estoy llamando a una función para importar una matriz de cv :: Mats - Quiero convertir mi cv :: Mat en una IplImage * para que pueda copiarlo en la matriz.

Actualmente estoy tratando de esto:

while(loop over cv::Mat array) 
{ 
    IplImage* xyz = &(IplImage(array[i])); 
    cvCopy(iplimagearray[i], xyz); 
} 

que genera una violación de segmento.

también tratando:

while(loop over cv::Mat array) 
{ 
    IplImage* xyz; 
    xyz = &array[i]; 
    cvCopy(iplimagearray[i], xyz); 
} 

Lo que me da un error de tiempo de compilación de: error: cannot convert ‘cv::Mat*’ to ‘IplImage*’ in assignment

Atrapado en cuanto a cómo puedo ir más allá y agradecería algún consejo :)

+0

posible duplicado de [OpenCV C++ y cvSmooth] (http://stackoverflow.com/questions/5449946/opencv-c-and-cvsmooth) – karlphillip

Respuesta

19

cv::Mat es el nuevo tipo se introduce en OpenCV2.X, mientras que el IplImage* es la estructura de imagen "heredada".

Aunque, cv::Mat admite el uso de IplImage en los parámetros del constructor, la biblioteca predeterminada no proporciona la función para el otro modo. Necesitará extraer la información del encabezado de la imagen manualmente. (Recuerde que necesita asignar la estructura IplImage, que es falta en su ejemplo).

+39

Lo hace proporcionar una conversión a IplImage, creando un encabezado sin copiar los datos. Entonces 'IplImage * img = new IplImage (mat);' debería funcionar. – etarion

+36

En realidad, puedes hacer esto: 'IplImage iplimg = mat;' y simplemente usar '& iplimg' donde sea que necesites una' IplImage'. No hay necesidad de asignación dinámica. –

+0

@etarion IplImage no tiene ninguna función que pueda hacer esa conversión. ¿Por qué IplImage * img = new IplImage (mat) está funcionando? – ajaxhe

1

Personalmente, creo que no es el problema causado por el tipo de fundido, pero un problema de desbordamiento de búfer; es esta línea

cvCopy(iplimagearray[i], xyz); 

que creo que va a causar fallos segmento, le sugiero que confirme la matriz iplimagearray [i] tienen suficiente tamaño del búfer para recibir datos copyed

0

De acuerdo con OpenCV cheat-sheet esto puede ser hecho de la siguiente manera:

IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1); 
Mat newC = cvarrToMat(oldC0); 

La función cv::cvarrToMat se ocupa de los problemas de conversión.

+4

Preguntó frente a –

+0

Creo que cvarrToMat ya no existe en opencv 2.4.5 –

17
Mat image1; 
IplImage* image2=cvCloneImage(&(IplImage)image1); 

Supongo que esto hará el trabajo.

Editar: Si se enfrenta a errores de compilación, tratan de esta manera:

cv::Mat image1; 
IplImage* image2; 
image2 = cvCreateImage(cvSize(image1.cols,image1.rows),8,3); 
IplImage ipltemp=image1; 
cvCopy(&ipltemp,image2); 
+0

¿Podría explicar este fragmento? – chepseskaf

+1

@chepseskaf conversión explícita de sintaxis de molde. – William

+0

@William: Estoy obteniendo la dirección _taking de advertencia_ temporal mientras uso el código anterior – Deepak

10
(you have cv::Mat old) 
IplImage copy = old; 
IplImage* new_image = © 

se trabaja con nueva como originalmente declarado IplImage *.

+0

esta es la mejor manera y funciona como un encanto! todas las otras formas son demasiado complicadas y esta es la mejor. Funcionó para mí –

0

En el caso de una imagen gris, ¡estoy usando esta función y funciona bien! Sin embargo se debe tener cuidado acerca de las características de función;)

CvMat * src= cvCreateMat(300,300,CV_32FC1);  
IplImage *dist= cvCreateImage(cvGetSize(dist),IPL_DEPTH_32F,3); 

cvConvertScale(src, dist, 1, 0); 
+1

por favor, el viejo c-api está MUERTO. detener ese sh nigromántico ... – berak

Cuestiones relacionadas