Mat - > IplImage *转换与数据副本

时间:2011-05-26 22:03:22

标签: opencv iplimage opencv-mat

我有以下功能。我想将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 个答案:

答案 0 :(得分:2)

简短版本:转换为临时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构造函数没有&#39 ; t首先复制数据。如果你重新分配,那么......

  } 

  // 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(*)
}