CUDA,NPP过滤器

Ste*_*rup 4 c++ cuda image-processing convolution npp

CUDA NPP库支持使用nppiFilter_8u_C1R命令过滤图像,但不断出现错误.启动boxFilterNPP示例代码并没有问题.

eStatusNPP = nppiFilterBox_8u_C1R(oDeviceSrc.data(), oDeviceSrc.pitch(), 
                                  oDeviceDst.data(), oDeviceDst.pitch(), 
                                  oSizeROI, oMaskSize, oAnchor);
Run Code Online (Sandbox Code Playgroud)

但是,如果我将其更改为使用nppiFilter_8u_C1R,则eStatusNPP将返回错误-24(NPP_TEXTURE_BIND_ERROR).下面的代码是我对原始boxFilterNPP样本所做的更改.

NppiSize oMaskSize = {5,5};
npp::ImageCPU_32s_C1 hostKernel(5,5);

for(int x = 0 ; x < 5; x++){
    for(int y = 0 ; y < 5; y++){
        hostKernel.pixels(x,y)[0].x = 1;
    }
}

npp::ImageNPP_32s_C1 pKernel(hostKernel);

Npp32s nDivisor = 1;

eStatusNPP = nppiFilter_8u_C1R(oDeviceSrc.data(), oDeviceSrc.pitch(), 
                               oDeviceDst.data(), oDeviceDst.pitch(), 
                               oSizeROI, 
                               pKernel.data(),
                               oMaskSize, oAnchor,
                               nDivisor);
Run Code Online (Sandbox Code Playgroud)

这已在CUDA 4.2和5.0上尝试过,结果相同.

当oMaskSize = {1,1}时,代码以预期结果运行

小智 7

滤波器应用向上和向左延伸的掩模,遵循两个函数之间的卷积反转第二函数的方向的数学约定.

盒式过滤器面罩向下和向右延伸,这可能更直观.

在任何情况下,问题都是由于改变的代码中的输入图像必须以实际上为SOURCE [-4,-4]的方式进行采样以便计算DESTINATION [0,0].由于输入图像是通过纹理采样器访问的,因此将源图像指针偏移(-4,-4)会导致您看到的纹理绑定错误.

解决方法:此问题的最简单的解决方法是将锚点设置为(4,4),这将有效地将掩码向下移动到右侧.您还需要注意,你要反转的权重核心阵列中(即K[-4, -4] -> K[0, 0],K[0, 0] -> K[-4, -4]等).