1

我正在尝试使用 openCV 在我的 NVidia GPU 上实现计算机视觉算法。我正在使用 openCV 2.4,我目前正在编写非常简单的程序来习惯 openCV。我编写了一个简单的转置矩阵代码,并在 GPU 上实现了精明的边缘检测。该程序运行良好,但我需要释放 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 用于 cpu 和 cv::gpu::GpuMat::Release 用于 GPU 端。但我不知道如何使用它们或我应该如何在我的代码中使用这些函数,以便我可以释放我的 CPU 和 GPU 内存。如果有人可以指导我正确使用 Release api 以便我可以成功释放内存,那将非常有帮助。感谢您的支持。

4

1 回答 1

2

对象的析构函数cv::Mat会自动释放内存,调用您描述的释放函数。在您的代码级别,您不必担心这一点。一旦矩阵离开作用域,它就会被销毁。

如果您想手动销毁对数据的引用,您可以调用,例如,src.release(). OpenCV 文档中有一个很好的内存管理教程,可以在这里找到

于 2012-11-24T04:35:45.557 回答