我在opencv中经历过一些内存管理模糊。 您可以使用新的opencv c ++类执行此操作:
cv::Mat theimage = cvLoadImage("rawimage.pgm",CV_LOAD_IMAGE_ANYDEPTH);
现在我不明白如果我做以下操作我会收到错误:
theimage.deallocate();
也许这是错的。我做了一些实验,当我发布Mat对象时:
theimage.release();
IplImage对象仍然保留在内存中。有没有办法说cv :: Mat对象破坏IplImage对象或是我的第一行代码错误(因为我丢失了IplImage对象的指针)? 我在互联网上看到很多例子,人们使用第一行代码。许多人解释了如何转换,但没有人解释内存会发生什么!
问题是我有许多使用IplImage对象的类(我使用它启动了我的项目)。我理解为什么cv :: Mat比IplImage更好。
- 编辑 -
在互联网上,我找到了以下混合解决方案:
cv::Ptr<IplImage> tmp = cvLoadImage("rawimage.pgm",CV_LOAD_IMAGE_ANYDEPTH);
cv::Mat theimage(tmp);
我认为这可以解决我的一些问题但是使我的代码有点难以理解,而且在我看来仍然很危险。 如果tmp在cv :: Mat之前被释放,我将使用一些损坏的对象(我没有测试过,但我认为是这样)。简单的方法是使用副本:
cv::Mat theimage(tmp,true);
这是我找到的唯一解决方案,但对我来说感觉不对......
答案 0 :(得分:3)
模糊性来自极端可怕的做法:将C接口与OpenCV的C ++接口混合在一起。不要这样做,而是使用cv::imread()
。
cv::Mat
will always deallocate memory when needed的析构函数,除3>}之外的,然后取决于您使用{{1>来释放它的资源}} 即可。我写了一个简单的实验来验证这些信息:
deallocate()
void load()
{
cv::Mat img = cvLoadImage("out.png", 1);
std::cout << "* IMG was loaded\n";
getchar();
img.deallocate();
}
int main()
{
load();
std::cout << "* IMG was deallocated\n";
getchar();
return 0;
}
次调用暂停程序,以便检查应用程序的内存占用量。如果您注释掉getchar()
,您会注意到加载图像后内存占用量不会减少。
在旁注中,initialized from a IplImage
仅减少引用计数器并在需要时释放数据(但如果从deallocate()
初始化Mat
,它也不会解除分配。 / p>