Mat对象使用引用计数,因此当销毁最后一个Mat对象时,将释放矩阵。如果我们从Mat
创建IplImage*
,会发生什么:
IplImage* img = cvLoadImage("test.png", 1);
{
Mat mtx(img); // convert IplImage* -> Mat
}
IplImage
是否也持有引用,或者在Mat被销毁后是否会留下悬空指针?
答案 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>
要避免它,如果绝对必要