cv::Mat 由 IplImage 和引用计数创建

cv::Mat created from IplImage and reference counting

本文关键字:创建 引用 IplImage Mat cv      更新时间:2023-10-16

Mat 对象使用引用计数,因此当最后一个 Mat 对象被销毁时,矩阵将被释放。如果我们从IplImage*创建Mat会发生什么,但是:

IplImage* img = cvLoadImage("test.png", 1);
{
    Mat mtx(img); // convert IplImage* -> Mat
}

IplImage是否也持有参考,或者一旦垫子被摧毁,它会留下一个悬空的指针?

如果您查看此处的文档,该运算符有一个copyData参数。

Mat::Mat(const IplImage* img, bool copyData=false)

文档说明如下:

img – 指向旧式 IplImage 图像结构的指针。默认情况下,数据在原始图像和新矩阵之间共享。但是,当设置了 copyData 时,将创建图像数据的完整副本。

因此,如果您使用copyData=true mtx变量将拥有自己的内存,或者如果您使用copyData=false mtx变量将共享img的内存。在任何一种情况下,当mtx被销毁时img都不会悬空,但是如果您希望它被销毁,则需要通过调用释放函数来清理它。此外,在第一种情况下,您可以在销毁mtx之前释放img,在后一种情况下,您不能。

注意:IplImage 中没有引用计数。

你为什么使用 IplImage?现在你应该只坚持使用 cv::Mat(没有 cv::Mat* 或 IplImage)。

此外,使用 IplImage* 会导致指针悬空,一旦您的垫子被破坏。最好使用

std::shared_ptr<cv::Mat>

std::unique_ptr<cv::Mat>

避免它,如果绝对必要