[英]Nvidia NPP nppiFilter produces garbage when convolving with 2d kernel
[英]Setting pixel values in Nvidia NPP ImageCPU objects?
在Nvidia的性能基元(NPP)的图像处理的例子CUDA SDK分布 ,图像通常存储在CPU上ImageCPU
对象,图像被存储在GPU上作为ImageNPP
对象。
boxFilterNPP.cpp是使用这些ImageCPU
和ImageNPP
对象的CUDA SDK中的示例。
当使用像nppiFilter
这样的过滤器(卷积)函数时,将过滤器定义为ImageCPU
对象是ImageCPU
。 但是,我没有看到设置ImageCPU
对象值的明确方法。
npp::ImageCPU_32f_C1 hostKernel(3,3); //allocate space for 3x3 convolution kernel
//want to set hostKernel to [-1 0 1; -1 0 1; -1 0 1]
hostKernel[0][0] = -1; //this doesn't compile
hostKernel(0,0) = -1; //this doesn't compile
hostKernel.at(0,0) = -1; //this doesn't compile
如何手动将值放入ImageCPU
对象?
笔记:
nppiFilter
; 我只是提到nppiFilter
是将值写入ImageCPU
对象的一个激励性示例。 ImageCPU
对象,因为nppiFilterBox
是的一种特殊情况nppiFilter
使用一个内置的高斯平滑滤波器(大概就像[1 1 1 1 1 1; 1 1 1] )。 要为像素/矩阵指定值:
hostKernel.pixels(0,0)[0].x = -1;
你说:“当使用像nppiFilter这样的过滤器(卷积)函数时,将过滤器定义为ImageCPU对象是有意义的。”
这是错误的,也是个坏主意。 图像数据通常以“行填充”格式存储,NPP的CUDA SDK样本附带的图像类确实使用专用的2D内存分配器,在每行的末尾添加填充字节。 这样,每行的第一个像素落在64字节对齐的地址上。 这是出于性能原因(在CPU和GPU上)。
另一方面,用于像nppiFilter这样的原语的内核数组需要紧密包装。 这就是为什么显示的代码不起作用的原因。
对于1通道(例如32f_C1
),此方法有效:
hostKernel.pixels(0,0) = -1;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.