【问题标题】:Automatically free user data in Mat. Is it possible?在 Mat 中自动释放用户数据。是否可以?
【发布时间】:2013-09-06 14:50:18
【问题描述】:

我正在使用从单独文件中获取的数据创建一个 Mat 实例。这样一来,我就失去了自动内存管理的优势:

char* data = new char[dataLength];
readLength = stream.readRawData(data, dataLength);
Mat image( heigth, width, CV_16U, data );

文档说我必须自己释放这段内存。

delete[] data;

我想要的是一旦 Mat 实例超出范围就释放内存。好像我用 imread 函数创建了 Mat。

文档提供使用 Ptr 模板类作为智能指针。(http://docs.opencv.org/modules/core/doc/intro.html) 但我不知道如何将它与 char 数组一起使用。

我想我可以为 Mat 写一个包装器,这样可以释放内存。但是有没有其他办法呢?

提前致谢。

更新:

是的,这种使用 Ptr 的方式编译得很好,但仍然没有按预期工作。我以为我没有正确使用 Ptr 。看起来我的问题的性质不止于此。这是我的代码:

Mat readImage() {

...

Ptr<char> data = new char[dataLength];
readLength = stream.readRawData(data, dataLength);
Mat image( heigth, width, CV_16U, data );
return image;}

这可能是函数返回时我的智能指针被弄乱了吗?这是因为当函数在我的代码中返回时复制了 Mat 吗?

更新二:

实际上我希望在函数返回后不释放数据。我试过这段代码:

Mat readImage() {

...

Ptr<char> data = new char[dataLength];
readLength = stream.readRawData(data, dataLength);
Mat image( heigth, width, CV_16U, data );
data.addref();
return image;}

但事实证明,这与根本不使用智能指针是一样的。参考计数器不会像我希望的那样在 Mat 对象死亡时减少。但我真的可以对图像执行 clone() 以使数据使用自动内存管理。我得到了一些开销,但我可以忍受这个。感谢 sgar91,他提到了 clone() 函数。

【问题讨论】:

  • 我认为数据在cv::Ptr&lt;char&gt; dataMat image 之间共享。在引用计数变为零之前,数据不会被破坏。您正在返回图像。简单地返回一个 Mat 将返回 image 的浅表副本并增加其引用计数,因此 data 不会被删除。尝试像这样返回深层副本:return image.clone();.

标签: c++ opencv mat


【解决方案1】:

文档清楚地说明了如何使用Ptr 类进行自动内存管理。

而不是这个:

char* data = new char[dataLength];

你可以这样做:

cv::Ptr<char> data = new char[dataLength];

【讨论】:

  • 你也可以使用'std::vector data(dataLength);',并使用'&data[0]'。或 std::unique_ptr。或 boost::scoped_array。
  • 是的,自动内存管理有多种选择。 cv::Ptr 相当于 C++ 11 的 std::shared_ptr
  • 是的,这就是为什么我属于 cmets :-P。 (但我必须挑剔,std::vector 是 c++98,而 boost::scoped_array 完全是一个不同的库)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多