Преобразование cv :: Mat в IplImage * - PullRequest
49 голосов
/ 12 января 2011

Документация на это кажется невероятно пятнистой.

Я в основном получил пустой массив IplImage * s (IplImage ** imageArray), и я вызываю функцию для импорта массива cv :: Mats - я хочу преобразовать свой cv :: Matв IplImage *, чтобы я мог скопировать его в массив.

В настоящее время я пытаюсь это:

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

, который генерирует segfault.

Также пытается:

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

Что дает мне ошибку времени компиляции: error: cannot convert ‘cv::Mat*’ to ‘IplImage*’ in assignment

Застрял в том, как я могу пойти дальше, и был бы признателен за некоторые советы:)

Ответы [ 7 ]

22 голосов
/ 12 января 2011

cv::Mat - это новый тип, представленный в OpenCV2.X, в то время как IplImage* - это «устаревшая» структура изображения.

Хотя cv::Mat поддерживает использование IplImage в параметрах конструктора, библиотека по умолчанию не предоставляет функции для другого способа.Вам нужно будет извлечь информацию заголовка изображения вручную.(Помните, что вам нужно выделить структуру IplImage, чего нет в вашем примере).

18 голосов
/ 03 декабря 2012
Mat image1;
IplImage* image2=cvCloneImage(&(IplImage)image1);

Думаю, это сделает работу.

Редактировать: Если вы столкнулись с ошибками компиляции, попробуйте этот способ:

cv::Mat image1;
IplImage* image2;
image2 = cvCreateImage(cvSize(image1.cols,image1.rows),8,3);
IplImage ipltemp=image1;
cvCopy(&ipltemp,image2);
12 голосов
/ 24 февраля 2013
 (you have cv::Mat old)
 IplImage copy = old;
 IplImage* new_image = ©

вы работаете с новым как первоначально объявленный IplImage *.

1 голос
/ 31 мая 2011

Лично я думаю, что это не проблема, вызванная приведением типов, а проблема переполнения буфера;Я думаю, что именно эта строка

cvCopy(iplimagearray[i], xyz);   

вызовет ошибку сегмента. Я предлагаю вам подтвердить, что массив iplimagearray [i] имеет достаточный размер буфера для получения скопированных данных

0 голосов
/ 27 июля 2018

Одной из проблем может быть: при использовании внешнего ipl и определении HAVE_IPL в вашем проекте, 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]);
}

найдено в ../OpenCV/modules/core/src/matrix.cpp не используется / не создан и преобразование завершается неудачей.

Вы можете переопределить его так, как:

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 голосов
/ 28 мая 2014

В случае серого изображения, я использую эту функцию, и она отлично работает!однако вы должны позаботиться о функциях функции;)

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

cvConvertScale(src, dist, 1, 0);
0 голосов
/ 28 июля 2012

Согласно OpenCV шпаргалке это можно сделать следующим образом:

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

Функция cv :: cvarrToMat решает проблемы преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...