cv::cuda::PtrStep
は、GpuMat
のデータをカスタムカーネルに直接渡すために使用されています。私は1チャンネルアクセスの例を見つけたhereしかし私の場合は2チャンネルのマット(CV_32FC2
)です。この場合、複素数値が次のようにコード化されている複素絶対二乗値を達成しようとしています。実数部は第1面、虚数部は第2面であるMat
です。GpuMat - カスタムカーネルで2チャンネルフロートデータにアクセスする
私が試した:
__global__ void testKernel(const cv::cuda::PtrStepSz<cv::Vec2f> input, cv::cuda::PtrStepf output)
{
int x = blockIdx.x * blockDim.x + threadIdx.x;
int y = blockIdx.y * blockDim.y + threadIdx.y;
if (x <= input.cols - 1 && y <= input.rows - 1 && y >= 0 && x >= 0)
{
float val_re = input(x, y)[0];
float val_im = input(x, y) [1];
output(x, y) = val_re * val_re + val_im * val_im;
}
}
をが、これは、次のエラーが発生:
calling a __host__ function("cv::Vec<float, (int)2> ::operator []") from a __global__ function("gpuholo::testKernel") is not allowed
は、私はそれを取得します。 []
はcv::Vec2f
ではなく、cv::cuda::Vec2f
(明らかに存在しない)のため、制限された機能である__host__
です。しかし、私は本当にデータにアクセスしたいと思っています。
Vec2f
のようなデバイス側の2チャネルデータにアクセスする他のメカニズムはありますか?
__global__ void testKernel(const cv::cuda::PtrStepSzf re, const cv::cuda::PtrStepSzf im, cv::cuda::PtrStepf output)
が、私は、「クリーンな」解決策があるのかどうか迷っVec2f
だ:カーネルは次のようになりますので、私はinput
Mat
CV_32FC1
2にSを分割する形での回避策を考え
のようなものです。
あなたが代わりに '' CV :: Vec2f'のfloat2'を使用することができます。また、 'input(x、y)'は 'input(y、x)'でなければなりません。 – dari