我正在开发一个OpenCV矩阵缓存系统的简单实现。作为其中的一部分,我不断加载和释放cv::Mat
个对象,只需将其解除引用为:
cv::Mat mat = ...
mat = cv::Mat();
当处理类型为CV_8U
的矩阵时,内存不会被释放并返回到操作系统,而类型为CV_32F
的矩阵。
重现问题的示例程序是:
#include <opencv2/core/core.hpp>
int main(int argc, char **argv) {
printf("-- Loading matrix of ones, press enter to continue...");
getchar();
cv::Mat mat = cv::Mat::ones(3000, 32, CV_8U);
printf("-- Freeing memory, press enter to continue...");
getchar();
mat = cv::Mat();
printf("-- Done, press enter to continue...");
getchar();
return 0;
}
使用类型CV_32F
时,内存有效释放并返回到操作系统,而类型CV_8U
则没有。要检查内存是否空闲,我只是查看系统进程监视器。
我的系统是基于x86_64架构的Ubuntu 12.10。我正在使用g ++ 4.7.2作为编译器,而OpenCV 2.4.6.1与我通过PPA安装的ROS Groovy捆绑在一起。