【问题标题】:Release Mat inside std::vector在 std::vector 中释放 Mat
【发布时间】:2011-08-30 19:52:04
【问题描述】:

使用 OpenCV 2.2,我正在尝试释放内存,调用释放到 Mat 图像 在 std::vector 内,例如:

std::vector < Mat > matVec;

不过好像

for (int k = 0; k < matVec.size(); k++)
{

   matVec[k].release();

}

没有释放任何内存(但它仍然可以编译)。

我知道 OpenCV 2.2 中有新的内存管理,但我没有发现 问题。

使用IplImage* 类型而不是 Mat(使用 cvReleaseImage() 而不是 Mat 成员函数 .release())的类似示例可以正常工作。

有什么提示吗?

【问题讨论】:

    标签: c++ image opencv vector release


    【解决方案1】:

    最好的方法是激活每个matVec[k] 对象的析构函数。您可以通过让matVec 超出范围或将matVec 定义为Mat*vector 并手动分配和解除分配每个对象来做到这一点。

    这总是更安全,因为 OpenCV 使用 Mat 对象的引用计数机制,因此您不想直接释放 Mat 中的数据。

    【讨论】:

      【解决方案2】:

      .release() 只应在特殊情况下调用,而不是日常使用。只需清除向量:

      std::vector<cv::Mat>().swap(matVec);
      

      这会调用每个Mats 的析构函数,释放内存(如果没有其他cv::Mat 指向它 - 请记住cv::MatIplImage 不同,是一个引用计数数据类型。如果它是在其他地方引用,您也必须清除该引用)。如果您想保留向量,但删除内容,请将代码中的 .release() 行替换为:

      matVec[k] = cv::Mat();
      

      【讨论】:

      • 谢谢,Jacob,etarion!我感谢您的帮助。以及您将如何执行以下操作:假设您要将图像 push_back 到 matVec 中。然而,这些图像最初是 IplImage*。您将如何使用您建议的方法从 IplImage* 转换为 Mat 以便仍然可以正确清理矢量?谢谢!
      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      相关资源
      最近更新 更多