Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Nvidia NPP ImageCPU对象中设置像素值?_C++_Image Processing_Cuda_Nvidia - Fatal编程技术网

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

C++ 在Nvidia NPP ImageCPU对象中设置像素值?,c++,image-processing,cuda,nvidia,C++,Image Processing,Cuda,Nvidia,在中的图像处理示例中,图像通常作为ImageCPU对象存储在CPU上,并且图像作为ImageNPP对象存储在GPU上 是CUDA SDK中使用这些ImageCPU和ImageNPP对象的示例 当使用像nppiFilter这样的过滤器(卷积)函数时,将过滤器定义为ImageCPU对象是有意义的。但是,我看不到设置ImageCPU对象值的明确方法 npp::ImageCPU_32f_C1 hostKernel(3,3); //allocate space for 3x3 convolution ke

在中的图像处理示例中,图像通常作为
ImageCPU
对象存储在CPU上,并且图像作为
ImageNPP
对象存储在GPU上

是CUDA SDK中使用这些
ImageCPU
ImageNPP
对象的示例

当使用像
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
    对象的一个激励示例
  • 该示例不涉及直接写入
    ImageCPU
    对象,因为
    nppiFilterBox
    nppiFilter
    的特例,它使用内置的高斯平滑滤波器(可能类似于[11;11;11])

为像素/矩阵赋值:

hostKernel.pixels(0,0)[0].x = -1;
您的意思是:“当使用像nppiFilter这样的过滤器(卷积)函数时,将过滤器定义为ImageCPU对象是有意义的。”

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

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

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

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

看起来你可以使用nppiSet,它需要一个像素值和一个ROI,但我认为你可以将一个ROI定义为一个像素,从而设置一个像素的值,如果你是这么想的话。例如,参考第7.6.2.154节。当使用类型
32f_C1
时,额外的
[0]
索引做什么?换句话说,
hostKernel.pixels(0,0)[0]
hostKernel.pixels(0,0)
之间有什么区别?还有,什么是
x
?我不知道x,而是它的值。但是[0]指示您试图更改图像的哪个频道。灰度图像有1个通道,RGB有3个通道。结果是
hostKernel.pixels(0,0)[0]。x=-1不编译。编译并正常工作的是:
hostKernel.pixels(0,0)=-1
假设,如果我使用多通道图像(例如,
32f_C3
),我们将有一个额外的索引来指定如下通道:
hostKernel.pixels(0,0)][channelIdx]=-1好的观点。我还尝试将过滤器定义为
Npp32s
数组。数组在主机上是1D(
NppiSize-kernelSize={3,3};Npp32s-hostKernel[9]={-1,0,1,1,0,1};
)。我使用
cudamallocitch
在设备上分配空间,并使用
cudaMemcpy2d
hostKernel
复制到设备上。当我将我的
deviceKernel
传递到
nppiFilter
时,我得到错误
-3
,它对应于
NPP\u CUDA\u KERNEL\u EXECUTION\u error
。请注意,调用
nppiFilterBox_8u_1R
工作正常,没有错误,并输出视觉上正确的图像。(
版本有一个预定义的所有过滤器。)