画像の周波数フィルタリングの GPU 実装に取り組んでいます。私のコードはCPUでうまく機能します(私はこのようなものを使用しました)が、GPUで同じ作業をしようとして一日中費やしましたが、成功しませんでした。周波数領域でフィルターを適用したいので、順変換の完全な (複雑な) 結果が必要です。完全なスペクトル (32FC2) を取得するには、dft を転送するために 2 つの複素行列 (src と dst) を渡す必要があることを読みました。ただし、逆変換後に同じ画像を取得できません (返された画像は非常に歪んでいます)。
私のコード(最も近い結果):
gpu.img1 = gpu::GpuMat(vrH, imgWidth, CV_32FC2);
gpu.img2 = gpu::GpuMat(vrH, imgWidth, CV_32FC2);
gpu.img4 = gpu::GpuMat(vrH, imgWidth, CV_32FC1);
gpu.img5 = gpu::GpuMat(vrH, imgWidth, CV_8UC1);
Mat planes[] = {imageIn, Mat::zeros(imageIn.size(), CV_32FC1)};
merge(planes, 2, imageIn);
gpu::Stream stream;
gpu.img1.upload(imageIn);
gpu::dft(gpu.img1, gpu.img2, gpu.img1.size(), 0, stream);
gpu::dft(gpu.img2, gpu.img4, gpu.img1.size(), DFT_INVERSE | DFT_REAL_OUTPUT | DFT_SCALE, stream);
stream.enqueueConvert(gpu.img4, gpu.img5, CV_8U);
stream.waitForCompletion();
gpu.img5.download(imageOut);
namedWindow("processed",1); imshow("processed", imageOut); waitKey(1000);
あなたの助けと提案は大歓迎です。