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]等).
| 归档时间: |
|
| 查看次数: |
2547 次 |
| 最近记录: |