我有以下功能。我想从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;
 }

最佳答案

简短版本:转换为临时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),则您无需将数据复制回去,因为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();

由于 vector 始终超出范围,因此这不是必需的。
   }
  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(*)
}

关于opencv - Mat-> IplImage *转换为数据副本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6145661/

10-12 23:08