【问题标题】:Mat -> IplImage * conversion with data copyMat -> IplImage * 转换与数据复制
【发布时间】:2011-09-02 23:47:59
【问题描述】:

我有以下功能。我想将一些数据从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;
 }

【问题讨论】:

    标签: opencv iplimage opencv-mat


    【解决方案1】:

    短版:转换为临时的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(*)
    } 
    

    【讨论】:

    • @Ali:我刚刚注意到您可以将 CreateImageCopy 调用替换为 srcImage[i] = cvCloneImage(&amp;src);
    猜你喜欢
    • 2011-06-07
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多