2012-01-27 49 views
3

我正在开发一个程序,使用Android NDK对全质量相机照片进行一些图像处理。所以,显然内存使用是一个大问题。使用opencv 2.0明确发布Mat

有时候我不再需要Mat的内容 - 我知道当它超出范围时它会自动释放,但是有一种很好的方式可以在早期释放它,所以我可以减少内存使用量?

它现在在我的Galaxy S II上运行良好,但显然这并不代表很多旧手机的功能!

回答

3

如果你只有一个矩阵指向你的数据,你可以做到这一点技巧:如果有多个垫指向你的数据

Mat img = imread("myImage.jpg"); 
// do some operations 
img = Mat(); // release it 

,你应该什么做的是释放所有的人

Mat img = imread("myImage.jpg"); 

Mat img2 = img; 
Mat roi = img(Rect(0,0,10,10)); 
// do some operations 

img = Mat(); // release all of them 
img2 = Mat(); 
roi = Mat(); 

或者使用推土机的方法:(?你确定这听起来像是在你的代码中插入错误)

Mat img = imread("myImage.jpg"); 

Mat img2 = img; 
Mat roi = img(Rect(0,0,10,10)); 
// do some operations 
char* imgData = (char*)img.data; 

free[] imgData; 

imshow("Look, this is called access violation exception", roi); 
+0

谢谢,我还没有尝试过,但它似乎是一个很好的方法! – Jords 2012-01-28 09:10:22

+2

前两个不同于替换每个“foo = Mat();”与“foo.release();”?我会哭泣看代码做第三个。 ;) – cape1232 2012-02-06 19:44:40

3

Mat :: release()应该可以做到。

参见:OpenCV Memory Management Documentation

+0

Mat.release()只是递减引用计数器。只有当计数器为零时才会释放内存。 – Sam 2012-01-27 06:30:19

+1

实际上,这是不是说选择的解决方案在将空Mat()分配给每个变量并引用数据的情况下会做什么? – cape1232 2012-02-06 19:45:41