2012-11-23 153 views
1

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

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的GPU端。但我没有得到如何使用它们,或者我应该如何在代码中使用这些函数,以便我可以释放机器人的CPU和GPU内存。如果有人能够引导我正确使用发行版apis,以便我能够成功释放内存,这将非常有帮助。感谢您的支持。

回答

2

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

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

+0

非常感谢您的回复。其实我没有任何C++的概念,我只知道C,而我是凭直觉做了这个编程的。所以这可能是这种愚蠢问题背后的原因。感谢您的网站和所有支持。 – duttasankha