1

以下のようにCPUバージョンを使用しました。

vector<float> descriptors;
cv::HOGDescriptor hog(cv::Size(24,32),cv::Size(12,12),cv::Size(4,4),cv::Size(6,6),6);
hog.compute(img, descriptors,cv::Size(8,8), cv::Size(0,0));

私の質問は、GPU を使用して「記述子」を取得する方法です。

次のコードを試しました。(動作しません)

cv::gpu::GpuMat gpu_value, gpu_descriptors;
cv::gpu::HOGDescriptor hog_gpu(Size(24,32),Size(12,12),Size(4,4),Size(6,6),6);
gpu_value.upload(img);
hog_gpu.getDescriptors(gpu_value,cv::Size(8,8),gpu_descriptors);

「gpu_descriptors」から「記述子」を取得するにはどうすればよいですか?

これを解決するのを手伝ってくれる人はいますか?どうもありがとう!

4

1 に答える 1

1

次のように、メンバー関数gpu_descriptorsを使用して CPU メモリにダウンロードできます。gpu::GpuMatdownload()

Mat cpu_descriptors; 
gpu_descriptors.download(cpu_descriptors);

ただし、ディスクリプタは CPU とは異なる方法で GPU に格納される場合があります。つまり、上記のコードで計算されcpu_descriptorsたものとまったく同じではない可能性があります。descriptorsしかし、あなたはそれを試すことができます。

編集vector<float>ディスクリプタを の形式で CPU メモリにダウンロードする方法はないようですgpu::HOGDescriptorgpu::SURF_GPU補足として、メンバー関数を使用して、機能検出器の記述子をダウンロードできることを知っています

void downloadDescriptors(const GpuMat& descriptorsGPU,
    vector<float>& descriptors);

これはまさにあなたが望むものです。しかし、残念ながら、何らかの理由でこの関数は には存在しませんcv::gpu::HOGDescriptorvector<float>データが記述子のタイプにどのように格納されているかを理解しようとしてから、フォーマットMatからvector<float>フォーマットへの変換を試みることができます。

于 2014-01-16T19:06:09.787 に答える