【问题标题】:OpenCV Matrix memory release after imread commandimread 命令后 OpenCV Matrix 内存释放
【发布时间】:2013-09-02 03:53:11
【问题描述】:

我有一个 for 循环,我在其中创建了一个本地 cv::Mat 对象来存储图像。代码如下所示:

for (int iter = 0; iter < totalNumberOfIterations; iter++)
{
    cv::Mat I = cv::imread(argv[1], 0);
    std::cout << "Reference count I: " << *I.refcount << std::endl;
    I.release();
}

在循环的第一次迭代中,我发现为变量“I”分配了内存,当我调用 I.release() 时,它被释放了。在随后的迭代中,内存不会被释放,我的程序的 RAM 消耗保持不变。似乎 OpenCV 为变量“I”保留内存以用于优化目的。这是真的吗?

for 循环的所有迭代中,变量“I”(*I.refcount)的引用计数保持为 1。

我正在使用 OpenCV 2.4.4,并且正在使用 gcc 4.6.4 编译我的代码。为了检查内存消耗,我在我的 Ubuntu 13.04 机器上使用了命令“top”。

编辑:当我不强制 OpenCV 读取灰度图像时,我注意到正在为变量“I”释放内存。 (注意第二个参数在 imread 命令中设置为“1”)。

cv::Mat I = cv::imread(argv[1], 1);

【问题讨论】:

    标签: c++ opencv memory-management


    【解决方案1】:

    您是否尝试过在 for 循环之前声明 Mat,每次迭代都覆盖它,然后释放它?

    I.E.

    cv::Mat I;
    for (int iter = 0; iter < totalNumberOfIterations; iter++)
    {
        I = cv::imread(argv[1], 0);
        std::cout << "Reference count I: " << *I.refcount << std::endl;
    }
    I.release();
    

    当然,这并不能解决它只发布一次的根本问题,但我相信它会产生相同的效果。还是有你不想那样做的原因?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 2014-01-07
      • 2016-05-08
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      相关资源
      最近更新 更多