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