我有一个 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);
答案 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();
当然,这并没有解决它只发布一次的潜在问题,但我相信它会产生同样的效果。或者你有没有理由不这样做?