Convirtiendo cv :: Mat a IplImage *

La documentación sobre esto parece increíblemente irregular.

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 *, así que puede copiarlo en la matriz.

Actualmente estoy intentando esto:

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

Lo cual genera una segfault.

También intentando:

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

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

Atascado en cuanto a cómo puedo ir más lejos y agradecería algunos consejos 🙂

cv::Mat es el nuevo tipo introducido en OpenCV2.X mientras que 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).

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

Supongo que esto hará el trabajo.

Editar: si enfrenta errores de comstackción, intente de esta manera:

 cv::Mat image1; IplImage* image2; image2 = cvCreateImage(cvSize(image1.cols,image1.rows),8,3); IplImage ipltemp=image1; cvCopy(&ipltemp,image2); 
  (you have cv::Mat old) IplImage copy = old; IplImage* new_image = © 

trabajas con una nueva IplImage declarada originalmente *.

Personalmente, creo que no es el problema causado por el tipo de conversión, sino un problema de desbordamiento del búfer; es esta línea

 cvCopy(iplimagearray[i], xyz); 

que creo que provocará una falla de segmento, sugiero que confirme que la matriz iplimagearray [i] tiene suficiente tamaño de búfer para recibir datos copiados

Según OpenCV cheat-sheet, esto se puede hacer 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.

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

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

Un problema podría ser: cuando se utiliza ipl externa y se define HAVE_IPL en su proyecto, el 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]); } 

encontrado en ../OpenCV/modules/core/src/matrix.cpp no ​​se utiliza / instancia y la conversión falla.

Puede volver a implementarlo de manera similar a:

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