【问题标题】:openCV cv::mat releaseopenCV cv::mat 发布
【发布时间】:2016-07-31 03:58:17
【问题描述】:

使用 openCV 时 cv::Mat。 http://docs.opencv.org/modules/core/doc/basic_structures.html 我知道正在使用某种智能指针。 我的问题是,为了进行一些内存优化。
我应该调用 cv::Mat release() 来释放未使用的矩阵吗?
还是应该相信编译器会这样做?

例如想想这段代码:

cv::Mat filterContours = cv::Mat::zeros(bwImg.size(),CV_8UC3);  
bwImg.release();
for (int i = 0; i < goodContours.size(); i++)
{
    cv::RNG rng(12345);
    cv::Scalar color = cv::Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
    cv::drawContours(filterContours,goodContours,i,color,CV_FILLED);        
}

/*% Fill any holes in the objects
bwImgLabeled = imfill(bwImgLabeled,'holes');*/


imageData = filterContours;
filterContours.release(); //should I call this line or not ?

【问题讨论】:

  • 当矩阵超出范围时,它将被释放(除非该矩阵的数据有不同的引用)
  • @Micka 如果这是一个计算时间很长的函数,会发生什么。发布会有帮助吗?
  • 它会给你一些记忆,这可能会或可能不会帮助你
  • 使用 RAII - 这是 c++ 最好的地方。

标签: c++ opencv


【解决方案1】:

cv::release() 函数释放内存,析构函数无论如何都会在 Mat 实例的作用域结束时处理这些内存。因此,您无需在您发布的代码 sn-p 中显式调用它。何时需要它的一个示例是 Matrix 的大小是否可以在同一循环内的不同迭代中变化,即,

using namespace cv;
int i = 0;
Mat myMat;
while(i++ < relevantCounter )
{
    myMat.create(sizeForThisIteration, CV_8UC1);

    //Do some stuff where the size of Mat can vary in different iterations\\

    mymat.release();
}

在这里,使用 cv::release() 可以节省编译器在每个循环中创建指针的开销

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2012-12-04
    • 2014-03-06
    相关资源
    最近更新 更多