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

时间:2014-11-28 08:17:40

标签: c++ opencv

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

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

IplImage是否也持有引用,或者在Mat被销毁后是否会留下悬空指针?

2 个答案:

答案 0 :(得分:5)

如果您查看文档here,则该运营商有一个copyData参数。

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

文档说明如下:

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

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

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

答案 1 :(得分:3)

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

此外,使用IplImage *会在Mat被破坏后导致悬空指针。 最好使用

std::shared_ptr<cv::Mat>

std::unique_ptr<cv::Mat>

要避免它,如果绝对必要