c++ - para - Convirtiendo cv:: Mat a IplImage*
opencv mac (6)
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);
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 compilació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 :)
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.
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).
(you have cv::Mat old)
IplImage copy = old;
IplImage* new_image = ©
trabajas con una nueva IplImage declarada originalmente *.
Mat image1;
IplImage* image2=cvCloneImage(&(IplImage)image1);
Supongo que esto hará el trabajo.
Editar: si enfrenta errores de compilació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);