Mat -> IplImage * преобразование с копией данных

У меня есть следующая функция. Я хочу скопировать некоторые данные из Mat в IplImage * введите и верните его в основной элемент управления. Это глупо, но я не мог найти правильный способ сделать это! Шпаргалка ничего не говорит о Mat->IplImage * преобразование с копией данных (так как мне нужно вне функции).

Любая идея или указатель приветствуется. Лучший - Али

int test(IplImage **srcImage, int num_images)
{
  vector<Mat> images(num_images); 
  for (int i = 0; i < num_images; ++i) 
  { 
    images[i] = Mat(srcImage[i]); // I guess should be correct! 
      .... 
     // some manipulations on images[i] 
  } 

  // this should be wrong!
  for (int i = 0; i < num_images; ++i) 
  { 
     cvReleaseImage(&srcImage[i]); 
     srcImage[i] = new IplImage(images[i]); 
     images[i].clear();
   } 
  return 0;
 }

1 ответ

Решение

Короткая версия: конвертировать во временную IplImageзатем используйте cvCopy,

Однако есть несколько проблем с вашим кодом:

int test(IplImage **srcImage, int num_images)
{
  vector<Mat> images(num_images); 
  for (int i = 0; i < num_images; ++i) 
  { 
    images[i] = Mat(srcImage[i]); // I guess should be correct!

до сих пор да.

      .... 
     // some manipulations on images[i] 

Если манипуляции на месте (не перераспределять Mats) вам не нужно копировать данные обратно, так как Mat Конструктор не копировал данные в первую очередь. Если вы перераспределите, то...

  } 

  // this should be wrong!
  for (int i = 0; i < num_images; ++i) 
  { 
     cvReleaseImage(&srcImage[i]);

Это может быть проблематично. images[i] может по-прежнему использовать ту же память.

     srcImage[i] = new IplImage(images[i]);

new IplImage не принесет вам пользы. Он не имеет конструкторов, используйте cvCreateImage,

     images[i].clear();

Это не обязательно, так как вектор все равно выходит из области видимости.

   } 
  return 0;
 }

Последний цикл должен выглядеть примерно так:

for (int i = 0; i < num_images; ++i) { 
     IplImage* old = srcImage[i]; // store pointer for later deallocation in case of shared data
     IplImage src = images[i];
     srcImage[i] = cvCreateImage(...); // fill appropriate parameters here. If you didn't change size/type/etc, you might not need to create/deallocate(*)
     cvCopy(&src, srcImage[i]);
     cvReleaseImage(&old); // now it is safe to deallocate(*)
} 
Другие вопросы по тегам