imread命令后的OpenCV Matrix内存释放

时间:2013-09-02 03:53:11

标签: c++ opencv memory-management

我有一个 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”保留了用于优化目的的内存。这是真的吗?

变量“I”(* I.refcount)的引用计数在 for 循环的所有迭代中保持为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);

1 个答案:

答案 0 :(得分:1)

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

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();

当然,这并没有解决它只发布一次的潜在问题,但我相信它会产生同样的效果。或者你有没有理由不这样做?