2

CUDA プラットフォームに顔検出アルゴリズムを実装するプロジェクトに取り組んでいます。

GpuMat現在、インスタンスの要素にアクセスしたいと思います。

次の従来の方法を試しました。

  1. から誘導しようとするとcv:Mat、 方法GpuMatがありません<T>.at
  2. を使用してみCV_MAT_ELEMましたが、エラーが表示されます。

FaceDetection.cuファイルの私のコードは次のとおりです。

        int DetectFacesGPU(cv::gpu::GpuMat * sumMat ,cv::gpu::GpuMat * qSumMat , float factor)
            {
                //
                int i = CV_MAT_ELEM(*sumMat,int ,0,0); 
                // 

エラーが表示される

Error   29  error : expression must have class type C:\Users\Shahar\Dropbox\OpenCV2.3\OpenCV2.3\FaceDetectionLatest\FaceDetectionCuda\FaceDetectionLatest\FaceDetection.cu  139
4

2 に答える 2

3

にダウンロードしてからcv::Mat、標準的な方法でアクセスする必要があります。

ダウンロードは次のように簡単だと思います:

cv::Mat mat;
sumMat->download(mat); // or something like that. 
于 2012-04-10T21:50:36.023 に答える
0

の定義からCV_MAT_ELEMCV_MAT_ELEM(*sumMat, int, 0, 0);は次のように展開されます。

*(int*)CV_MAT_ELEM_PTR_FAST(*sumMat, 0, 0, 4));

次に、次のように拡張されました。

*(int*)(assert ( 0 < (*sumMat).rows && 0 < (*sumMat).cols ),
               (*sumMat).data.ptr + (size_t)(*sumMat).step*0 + 4*0);

関数がデバイス コードとして定義されていると仮定するとDetectFacesGPU、デバイス コードでは逆参照できないため、上記のステートメントは正しくありませんsumMat。そうすることで、デバイス コードからホスト メモリにアクセスしています。GpuMatクラス自体はホストのメモリ上に配置されるので注意が必要です。デバイスメモリに割り当てられるのは、実際の行列データのみです。

したがってGpuMat、クラス自体は通常、カーネルに渡されません。カーネル内の個々のピクセルにアクセスするにGpuMatは、実際の行列データ (デバイス メモリ内) を参照するポインターをカーネルに渡し、そのポインターに対してポインター演算を実行する必要があります。

于 2017-05-28T13:13:52.733 に答える