gpt4 book ai didi

c++ - 如何强制 opencv 图像(cv::Mat)释放其内存

转载 作者:太空宇宙 更新时间:2023-11-03 22:52:31 28 4
gpt4 key购买 nike

我有这样一个类:

class MyClass
{
cv::Mat image;
public:
init()
{
image=imread("test.jpg");
}
cv::Mat getImage()
{
return image;
}
void reset()
{
// what should I write here?
}
}
cv::Mat myImage;

void main()
{
MyClass myclass;
myclass.init();
myImage=myclass.getImage();
// do something with image;
myclass.reset();
// at this point the memory allocated by myclass.image should be released and also myImage should be invalidated (be an empty image).
}

注意:我知道我可以将 myImage 设为局部变量并解决问题,但我想知道如何释放 cv::Mat 分配的内存,即使引用计数不为零也是如此。

image.release() 不释放内存,因为存在图像拷贝 (myImage),我需要确保即使存在图像拷贝也释放内存。

对于可能提示使 myImage 无效不是一个好主意的人,类规范说当调用重置时,所有由类创建的图像都变得无效,如果用户需要图像,他们需要在类上调用重置之前克隆它。

编辑1

解除分配不起作用,也不会释放内存。

最佳答案

这段代码呢?

  1. 分配内存来保存你的图像
  2. 使用预分配的内存创建 Mat header
  3. 将加载的图像复制到该内存

这应该会停用引用计数。

我没有尝试过,但我想它应该可行(我希望思路清晰)。但是,如果还有其他仍在使用的 Mat 引用,您显然会遇到访问错误!

class MyClass
{
cv::Mat image;
unsigned char * imageData; // TODO: set to zero in constructor!
public:
init()
{
cv::Mat tmp = imread("test.jpg");
// TODO: test if non-zero and release before allocating new memory
imageData = (unsigned char*) malloc(tmp.cols*tmp.rows*3*sizeof(unsigned char)); // allocate memory for your image
// TODO: maybe it is possible to get the size of "tmp"'s data directly, which would be much better because of widthStep things, etc. The formula "tmp.cols*tmp.rows*3*sizeof(unsigned char)" might not be correct for all kind of input images!

// create Mat header that uses present memory
image=cv::Mat(tmp.rows, tmp.cols, 3, imageData );

// copy loaded image to allocated memory:
tmp.copyTo(image); // here you must be sure that "image" is big enough to hold "tmp"'s data. Otherwise a new Mat will be created.

// tmp will be cleared automatically
}
cv::Mat getImage()
{
return image;
}
void reset()
{
image = cv::Mat();
free(imageData);
}
}

关于c++ - 如何强制 opencv 图像(cv::Mat)释放其内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36328605/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com