Подтвердить что ты не робот

Преобразование cv:: Mat в IplImage *

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

В основном я получил пустой массив 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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

cvCopy(iplimagearray[i], xyz);   

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

Ответ 5

В соответствии с OpenCV чит-лист это можно сделать следующим образом:

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

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

Ответ 6

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

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

cvConvertScale(src, dist, 1, 0);