cv::cuda::PtrStep
은 데이터를 사용자 정의 커널에 직접 전달하는 데 사용됩니다. 나는 하나의 채널 액세스 here 그러나 나의 경우 2 채널 매트 (CV_32FC2
)의 예를 발견했다. 이 경우 복잡한 값이 다음과 같이 인코딩되는 복잡한 절대 제곱 값을 얻으려고합니다. 실수 부분은 첫 번째 평면이고, 허수 부분은 주어진 두 번째 평면입니다. 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 채널 데이터에 액세스하는 다른 메커니즘이 있습니까? 커널의 모습 있도록
나는 두 CV_32FC1
Mat
들에 input
분할의 형태로 대안의 생각 :
__global__ void testKernel(const cv::cuda::PtrStepSzf re, const cv::cuda::PtrStepSzf im, cv::cuda::PtrStepf output)
하지만 난 "청소기"솔루션은 Vec2f
이 있는지 여부 궁금하네요 - 같은 것.
당신이 사용할 수있는'대신 이력서'의 float2' :: Vec2f'. 첫 번째 매개 변수가 행이고 두 번째 매개 변수가 열이기 때문에'input (x, y)'는'input (y, x)'이어야합니다. – dari