释放openCV中的内存分配

时间:2012-11-23 19:48:51

标签: opencv cuda gpgpu

我正在尝试使用openCV在我的NVidia GPU上实现计算机视觉算法。我正在使用openCV 2.4,我目前正在编写非常简单的程序来习惯openCV。我写了一个简单的代码转换矩阵,并在GPU上实现canny边缘检测。该程序运行正常,但我需要释放CPU和GPU中的内存。所以我在下面发布我的代码:

int main(int argc,char *argv[])
{
  int k;
  cv::Mat src;
  cv::Mat dest;
  cv::Mat dest_1;
  cv::gpu::GpuMat im_source;
  cv::gpu::GpuMat im_dest;
  cv::gpu::GpuMat im_dest_1;
  cv::gpu::Stream::Null;

  k = cv::gpu :: getCudaEnabledDeviceCount();
  printf("%d\n",k);

  src = cv::imread("lena.jpg",0);
  cv::imshow("lena_org",src);
  im_source.upload(src);

  cv::gpu::transpose(im_source,im_dest);

   im_dest.download(dest);

   cv::imshow("lena_trans",dest);

   cv::gpu::Canny(im_source,im_dest_1,100,100,3,false);

   im_dest_1.download(dest_1);
   cv::imshow("lena_edge",dest_1);
   cv::waitKey();

} 

所以从上面的代码中我相信内存不会在CPU和GPU中被释放。我在网上搜索了一下,我遇到了cv :: Mat :: Release for cpu和cv :: gpu :: GpuMat :: Release for GPU side。但我没有得到如何使用它们或如何在我的代码中使用此功能,以便我可以释放我的CPU和GPU内存。如果有人可以指导我正确使用Release apis以便我可以成功释放内存,那将非常有用。感谢您的支持。

1 个答案:

答案 0 :(得分:2)

cv::Mat对象的析构函数会自动释放内存,从而调用您描述的发布函数。在代码级别,您不必担心这一点。一旦矩阵离开范围,它就会被破坏。

如果您想手动销毁对数据的引用,可以调用src.release()。在OpenCV文档中有一个关于内存管理的好教程,可用here