Вам редко нужно позвонить release
явно, так как OpenCV Mat
объекты берут автоматически заботиться о внутренней памяти.
Также обратите внимание, что копия только копий создает новый заголовок, указывающий на те же данные. Если исходный Mat
выходит за рамки, вы остаетесь с недопустимой матрицей. Поэтому, когда вы вставляете изображение в вектор, используйте глубокую копию (clone()
), чтобы избежать изменения изображения в вектор.
Поскольку вы упомянули:
У меня есть большой 3D изображение, хранящееся в объекте Mat. Я бегу над ним, используя для циклов. создавая двумерный мат, называемый «изображением», помещая фрагменты в изображение, отталкивая обратное изображение к векторным изображениям. освобождая изображение. А позже сделайте цикл for на вектор-изображение, освобождая все матрицы по одному.
Вы можете хранить все фрагменты в векторе со следующим кодом. Чтобы освободить изображения в векторе, просто clear
вектор.
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
// Init the multidimensional image
int sizes[] = { 10, 7, 5 };
Mat data(3, sizes, CV_32F);
randu(data, Scalar(0, 0, 0), Scalar(1,1,1));
// Put slices into images
vector<Mat> images;
for (int z = 0; z < data.size[2]; ++z)
{
// Create the slice
Range ranges[] = { Range::all(), Range::all(), Range(z, z + 1) };
Mat slice(data(ranges).clone()); // with clone slice is continuous, but still 3d
Mat slice2d(2, &data.size[0], data.type(), slice.data); // make the slice a 2d image
// Clone the slice into the vector, or it becomes invalid when slice goes of of scope.
images.push_back(slice2d.clone());
}
// You can deallocate the multidimensional matrix now, if needed
data.release();
// Work with slices....
// Release the vector of slices
images.clear();
return 0;
}
@Miki изображения, которые я помещал в img, имеют один и тот же тип и размеры, но разные изображения. Представьте, что вы делаете что-то вроде imread (FileName) на каждой итерации. –
ah wait .. ваш код выглядит сломанным, почему вы вызываете 'img.release()' в цикле? – Micka
Да, в петле. так как я также создаю его в цикле. –