2012-11-23 198 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