1

openCVを使用してNVidiaGPUにコンピュータービジョンアルゴリズムを実装しようとしています。私はopenCV2.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の両方でメモリが解放されていないと思います。インターネットを少し検索していて、cpu :: Mat :: Releaseforcpuとcv::gpu :: GpuMat :: ReleaseforGPU側に出くわしました。しかし、CPUとGPUのメモリを解放するために、それらの使用方法やコードでこの関数を使用する方法がわかりません。誰かがリリースAPIの正しい使用法を案内してくれれば、メモリを正常に解放できるので非常に役立ちます。たくさんのご支援ありがとうございます。

4

1 に答える 1

2

オブジェクトのデストラクタはcv::Mat自動的にメモリを解放し、説明したリリース関数を呼び出します。コードのレベルでは、それについて心配する必要はありません。マトリックスがスコープを離れると、破棄されます。

データへの参照を手動で破棄する場合は、たとえば、を呼び出すことができますsrc.release()。OpenCVのドキュメントには、メモリ管理に関する優れたチュートリアルがあります。こちらから入手できます。

于 2012-11-24T04:35:45.557 に答える