繁体   English   中英

openCV将IplImage与cv :: Mat混合

[英]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()只会减少引用计数器并在需要时释放数据(但是如果MatIplImage初始化,它也不会释放)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM