2011-01-12 16 views
43

La documentazione su questo sembra incredibilmente discutibile.Conversione di cv :: Mat in IplImage *

Ho praticamente una matrice vuota di IplImage * s (IplImage ** imageArray) e sto chiamando una funzione per importare un array di cv :: Mats - Voglio convertire il mio cv :: Mat in un IplImage * così posso copiarlo nell'array.

Attualmente sto cercando questo:

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

che genera un segfault.

provare anche:

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

che mi dà un errore di tempo di compilazione di: error: cannot convert ‘cv::Mat*’ to ‘IplImage*’ in assignment

Bloccato quanto a come posso andare oltre e gradirebbe qualche consiglio :)

+0

possibile duplicato del [OpenCV C++ e cvSmooth] (http://stackoverflow.com/questions/5449946/opencv-c-and-cvsmooth) – karlphillip

risposta

19

cv::Mat è il nuovo tipo viene introdotto in OpenCV2.X mentre lo IplImage* è la struttura dell'immagine "legacy".

Sebbene, cv::Mat supporti l'utilizzo di IplImage nei parametri del costruttore, la libreria predefinita non fornisce la funzione per l'altro modo. Sarà necessario estrarre manualmente le informazioni dell'intestazione dell'immagine. (Ricordare che è necessario allocare la struttura IplImage, che è carente nell'esempio).

+39

Lo fa fornire una conversione a IplImage, creando un'intestazione senza copiare i dati. Quindi 'IplImage * img = new IplImage (mat);' dovrebbe funzionare. – etarion

+36

In realtà, puoi fare ciò: 'IplImage iplimg = mat;' e usa semplicemente '& iplimg' dove ti serve un' IplImage'. Non c'è bisogno di allocazione dinamica. –

+0

@etarion L'IplImage non ha alcuna funzione che può fare quella conversione. Perché IplImage * img = new IplImage (mat) funziona? – ajaxhe

1

Personalmente penso che non sia il problema causato dal tipo di trasmissione ma un problema di overflow del buffer; è questa linea

cvCopy(iplimagearray[i], xyz); 

che penso che causerà colpa segmento, vi suggerisco di confermare l'array iplimagearray [i] ho abbastanza dimensione del buffer per ricevere i dati copyed

0

Secondo OpenCV cheat-sheet questo può essere fatto come segue:

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

La funzione cv::cvarrToMat si prende cura dei problemi di conversione.

+4

Ha chiesto al lato opposto –

+0

Penso che cvarrToMat non esista più in opencv 2.4.5 –

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

Indovina che farà il lavoro.

Edit: Se dovete affrontare gli errori di compilazione, provare in questo modo:

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

Puoi spiegare questo frammento? – chepseskaf

+1

@chepseskaf converte la conversione esplicita della sintassi. – William

+0

@William: sto ricevendo _taking address of temporary_ warning durante l'utilizzo del codice sopra – Deepak

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

si lavora con nuovi come originariamente dichiarato IplImage *.

+0

questo è il modo migliore e funziona come un fascino! tutti gli altri modi sono troppo complicati e questo è il migliore. Ha funzionato per me –

0

In caso di immagine grigia, sto usando questa funzione e funziona perfettamente! tuttavia si deve prendere cura sulle caratteristiche di funzione;)

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

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

per favore, il vecchio c-api è MORTO. ferma quel negromantico ... – berak

Problemi correlati