在Nvidia NPP ImageCPU对象中设置像素值?

时间:2012-09-28 04:32:36

标签: c++ image-processing cuda nvidia

Nvidia Performance Primitives (NPP)CUDA SDK distribution图像处理示例中,图像通常作为ImageCPU个对象存储在CPU上,图像作为ImageNPP个对象存储在GPU上。

boxFilterNPP.cpp是CUDA SDK中使用这些ImageCPUImageNPP个对象的示例。

使用像nppiFilter这样的过滤器(卷积)函数时,将过滤器定义为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对象的激励示例。
  • boxFilterNPP.cpp示例不涉及直接写入ImageCPU对象,因为nppiFilterBox是使用内置高斯平滑滤镜的nppiFilter的特例(可能像[1 1 1; 1 1 1; 1 1 1])。

3 个答案:

答案 0 :(得分:1)

为像素/矩阵指定值:

hostKernel.pixels(0,0)[0].x = -1;

答案 1 :(得分:1)

你说:“当使用像nppiFilter这样的过滤器(卷积)函数时,将过滤器定义为ImageCPU对象是有意义的。”

这是错误的,也是个坏主意。图像数据通常以“行填充”格式存储,NPP的CUDA SDK样本附带的图像类确实使用专用的2D内存分配器,在每行的末尾添加填充字节。这样,每行的第一个像素落在64字节对齐的地址上。这样做是出于性能原因(在CPU和GPU上)。

另一方面,用于像nppiFilter这样的原语的内核数组需要紧密包装。这就是为什么显示的代码不起作用的原因。

答案 2 :(得分:0)

对于1通道(例如32f_C1),此方法有效:

hostKernel.pixels(0,0) = -1;