openCV将IplImage与cv :: Mat混合

时间:2012-06-22 12:18:34

标签: c++ c memory-management opencv memory-leaks

我在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);

这是我找到的唯一解决方案,但对我来说感觉不对......

1 个答案:

答案 0 :(得分:3)

模糊性来自极端可怕的做法:将C接口与OpenCV的C ++接口混合在一起。不要这样做,而是使用cv::imread()

cv::Mat will always deallocate memory when needed的析构函数,}之外的,然后取决于您使用{{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>