如果释放原始垫子,子垫子会发生什么

What happens to submats if the original mat is released

在 OpenCV 中,我正在获取图像并裁剪掉一些 ROI(使用 mat.submat(...))。我想避免克隆子垫以节省时间和内存,但我担心图像可能会在 rois 之前发布。鉴于 submat returns a Mat 使用原始 Mat 作为其后备存储,我的问题是:子垫在其父垫被释放后会发生什么?之后使用子垫是否安全?

下面是解释问题的代码:

// Some big image that I get from somewhere
Mat image = Mat.zeros(1080, 1920, CvType.CV_8UC3);

Mat roi = image.submat(10, 20, 10, 20);

image.release();

// Still safe to use roi? 
Mat blurredRoi = new Mat();
Imgproc.blur(roi, blurredRoi, new Size(5, 5));

OpenCV 使用引用计数。

submat 添加另一个对数据存储器的引用。

.release() 不会释放内存,除非最后一个引用是 removed/decremented.