[英]openCV mixing IplImage with cv::Mat
我用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);
这是我找到的唯一解决方案,但对我来说感觉不对......
模糊性来自极端可怕的做法 :将C接口与OpenCV的C ++接口混合在一起。 不要这样做,改用cv::imread()
。
cv::Mat
的析构函数总是在需要时解除分配内存 , 除非 从IplImage
初始化 它 ,然后由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()
调用暂停程序,以便您可以检查应用程序的内存占用量。 如果您注释掉deallocate()
您会注意到加载图像后内存占用量不会减少。
另外, Mat::release()
只会减少引用计数器并在需要时释放数据(但是如果Mat
从IplImage
初始化,它也不会释放)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.