2011-01-12 14 views
43

Dokumentacja na ten temat wydaje się niesamowicie rzadka.Konwersja cv :: Mat na IplImage *

Zasadniczo mam pustą tablicę IplImage * s (IplImage ** imageArray) i wywołuję funkcję importowania tablicy cv :: Mats - Chcę przekonwertować mój cv :: Mat na IplImage *, dzięki czemu mogę skopiować go do tablicy.

Obecnie próbuję to:

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

który generuje segfault.

próbuje również:

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

co daje mi błąd kompilacji czasowy: error: cannot convert ‘cv::Mat*’ to ‘IplImage*’ in assignment

Stuck, jak mogę iść dalej i byłby wdzięczny za rady :)

+0

możliwe duplikat [OpenCV C++ i cvSmooth] (http://stackoverflow.com/questions/5449946/opencv-c-and-cvsmooth) – karlphillip

Odpowiedz

19

cv::Mat jest nowy typ wprowadza w OpenCV2.X, podczas gdy IplImage* jest "starszą" strukturą obrazu.

Mimo że obsługuje użycie parametru IplImage w parametrach konstruktora, biblioteka domyślna nie zapewnia funkcji w inny sposób. Będziesz musiał ręcznie wyodrębnić informacje nagłówka obrazu. (Pamiętaj, że musisz przydzielić strukturę IplImage, czego nie ma w twoim przykładzie).

+39

Czyni zapewnić konwersję do IplImage, tworząc nagłówek bez kopiowania danych. Więc 'IplImage * img = new IplImage (mat);' powinien działać. – etarion

+36

Właściwie możesz to zrobić: 'IplImage iplimg = mat;' i po prostu użyj '& iplimg' wszędzie tam, gdzie potrzebujesz' IplImage'. Nie ma potrzeby przydzielania dynamicznego. –

+0

@etarion IplImage nie ma żadnej funkcji, która może wykonać tę konwersję. Dlaczego działa IplImage * img = new IplImage (mata)? – ajaxhe

1

Osobisty Myślę, że to nie problem spowodowany przez odlewanie, ale problem z przepełnieniem bufora; to jest ta linia

cvCopy(iplimagearray[i], xyz); 

że myślę spowoduje usterkę segmencie I sugerują, że potwierdzenie tablicę iplimagearray [i] ma wystarczającej wielkości bufora otrzymać copyed dane

0

Według OpenCV cheat-sheet może to być Wykonano:

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

Funkcja cv::cvarrToMat zajmuje się problemami z konwersją.

+4

Zapytał naprzeciwko –

+0

Myślę, że cvarrToMat już nie istnieje w opencv 2.4.5 –

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

Zgadnij, to zrobi robotę.

Edit: Jeśli twarz błędów kompilacji, spróbuj w ten sposób:

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

Czy mógłbyś wyjaśnić ten fragment? – chepseskaf

+1

@chepseskaf jawna konwersja składni. – William

+0

@William: Otrzymuję _taking adres temporary_ warning przy użyciu powyższego kodu – Deepak

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

pracy z nowym jak pierwotnie zadeklarowane IplImage *.

+0

jest to najlepszy sposób i działa jak urok! wszystkie inne sposoby są zbyt skomplikowane i to jest najlepsze. Pracowałem dla mnie –

0

W przypadku szarego obrazu używam tej funkcji i działa poprawnie! jednak należy zadbać o cechach funkcjonalnych;)

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

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

proszę, stary c-api jest martwy. przestańcie nekromantycznego sh ... – berak