Konwersja cv:: Mat do IplImage*

Dokumentacja na ten temat wydaje się niewiarygodnie plamista.

Mam w zasadzie pustą tablicę IplImage* s (IplImage* * imageArray) i wywołuję funkcję importującą tablicę CV::Mats - chcę przekonwertować moje cv::Mat na IplImage*, aby móc ją skopiować do tablicy.

Obecnie próbuję tego:

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

, który generuje segfault.

Także:

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

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

/ Align = "left" / dalej i będę wdzięczny za radę:)
 45
Author: amr, 2011-01-12

7 answers

cv::Mat jest nowym typem wprowadzonym w OpenCV2.X podczas gdy IplImage* jest "dziedziczną" strukturą obrazu.

Chociaż cv::Mat obsługuje użycie IplImage w parametrach konstruktora, domyślna biblioteka nie udostępnia funkcji w inny sposób. Musisz ręcznie wyodrębnić informacje z nagłówka obrazu. (Pamiętaj, że musisz przydzielić strukturę IplImage, czego brak w twoim przykładzie).

 21
Author: YeenFei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-17 12:45:04
Mat image1;
IplImage* image2=cvCloneImage(&(IplImage)image1);
To chyba wystarczy.

Edit: Jeśli napotkasz błędy 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);
 17
Author: William,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-16 08:43:14
 (you have cv::Mat old)
 IplImage copy = old;
 IplImage* new_image = ©

Pracujesz z new jako pierwotnie zadeklarowany IplImage*.

 10
Author: user2103629,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-30 15:29:20

Osobiście myślę, że nie jest to problem spowodowany odlewaniem typu, ale problem przepełnienia bufora; jest to ta linia

cvCopy(iplimagearray[i], xyz);   

Że myślę, że spowoduje błąd segmentu, sugeruję, aby potwierdzić tablicę iplimagearray [i] mieć wystarczającą wielkość bufora, aby otrzymać skopiowane dane

 1
Author: octavian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-31 21:46:06

Zgodnie z OpenCV cheat-sheet można to zrobić w następujący sposób:

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

Funkcja CV::cvarrtomat zajmuje się kwestiami konwersji.

 0
Author: chayan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-27 23:31:32

W przypadku szarego obrazu, używam tej funkcji i działa dobrze! musisz jednak zadbać o funkcje Funkcji;)

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

cvConvertScale(src, dist, 1, 0);
 0
Author: ksolid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-28 19:04:43

Jeden problem może być: gdy używasz zewnętrznego ipl i definiujesz HAVE_IPL w Twoim projekcie, 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]);
}

Znaleziono w ../OpenCV/modules/core / src / matrix.cpp nie jest używany/instancjowany i konwersja nie powiedzie się.

Możesz go ponownie zaimplementować w sposób podobny do:

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);
 0
Author: Timm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-27 11:13:06