6

我有一个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);
4

1 回答 1

1

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

IE

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

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

于 2013-09-04T19:18:12.570 回答