垫子 -> 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;
 }

短版本:转换为临时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]);

这可能会有问题。CCD_ 8可能仍在使用相同的存储器。

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

相关内容

  • 没有找到相关文章