在std::vector中释放Mat

3
使用OpenCV 2.2,我正在尝试通过调用std::vector中Mat图像的release方法来释放内存,例如:
std::vector < Mat > matVec;

然而,看起来好像…
for (int k = 0; k < matVec.size(); k++)
{

   matVec[k].release();

}

代码没有释放任何内存(虽然它仍然可以编译通过)。

我知道在OpenCV 2.2中有新的内存管理方式,但我无法找到问题所在。

使用IplImage*类型而非Mat类型的类似示例(使用cvReleaseImage()而非Mat成员函数.release())可以正常工作。

有什么提示吗?

2个回答

7

.release()方法只应在特殊情况下调用,不适合日常使用。只需清除向量即可:

std::vector<cv::Mat>().swap(matVec);

这将调用每个Mat的析构函数,释放内存(如果没有其他cv::Mat指向它 - 请记住cv::Mat是一个引用计数的数据类型,与IplImage不同)。如果它在其他地方被引用,您也必须清除该引用。如果您想保留向量,但摆脱其内容,请将代码中的.release()行替换为:
matVec[k] = cv::Mat();

1
谢谢,Jacob,etarion!感谢你们的帮助。接下来我有个问题:假设我想把图像推入matVec中。但是这些图像最初是IplImage格式的。你们怎么将IplImage转换为Mat,以便可以使用你们建议的方法正确清理向量?谢谢! - PV floripa

1

最好的方法是激活每个matVec[k]对象的析构函数。您可以通过让matVec超出范围或将matVec定义为Mat*vector并手动分配和释放每个对象来实现此目的。

这样做总是更安全的,因为OpenCV使用引用计数机制来处理Mat对象,所以您不希望直接释放Mat中的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接