我在使用 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 更好。
--EDIT--
在互联网上我找到了以下混合解决方案:
cv::Ptr<IplImage> tmp = cvLoadImage("rawimage.pgm",CV_LOAD_IMAGE_ANYDEPTH);
cv::Mat theimage(tmp);
我认为这可以解决我的一些问题,但使我的代码有点难以阅读,并且在我看来仍然很危险。
如果 tmp 在 cv::Mat 之前被释放,我将使用一些损坏的对象(我没有测试,但我认为确实如此)。最简单的方法是使用副本:
cv::Mat theimage(tmp,true);
这是我找到的唯一解决方案,但对我来说感觉不对......