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

sas*_*alm 0 c++ opencv

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

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

是否也有IplImage一个参考,或者一旦垫被毁坏它会留下一个悬垂的指针吗?

gun*_*yim 5

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

Mat::Mat(const IplImage* img, bool copyData=false)
Run Code Online (Sandbox Code Playgroud)

文档说明如下:

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

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

注意:没有引用计数IplImage.