Mat -> IplImage * преобразование с копией данных - PullRequest
1 голос
/ 27 мая 2011

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

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

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 Ответ

2 голосов
/ 27 мая 2011

Короткая версия: преобразовать во временную 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] 

Если манипуляции выполняются (не перераспределяйте Mat s), вам не нужно копировать данные обратно, так как конструктор 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(*)
} 
...