1

我有以下功能。我想从输入中复制一些数据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;
 }
4

1 回答 1

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] 

如果操作是就地的(不要重新分配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(*)
} 
于 2011-05-27T11:13:03.573 回答