Задание значений пикселей в объектах ImageCPU АЭС Nvidia?

в Nvidia Performance Primitives (АЭС) примеры обработки изображений в Распределение CUDA SDK, изображения обычно хранятся в CPU как ImageCPU объекты и изображения хранятся на GPU как ImageNPP объекты.

boxFilterNPP.cpp это пример из 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 объект.
  • boxFilterNPP.cpp пример не включает в себя запись непосредственно в ImageCPU объект, потому что nppiFilterBox это особый случай nppiFilter который использует встроенный гауссов сглаживающий фильтр (вероятно, что-то вроде [1 1 1; 1 1 1; 1 1 1]).

3

Решение

Чтобы назначить значения пикселю / матрице:

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

Другие решения

Вы говорите: «При использовании функции фильтра (свертки), такой как nppiFilter, имеет смысл определить фильтр как объект ImageCPU».

Это ложная и плохая идея. Данные изображения обычно хранятся в формате «с добавлением строки», а классы изображений, поставляемые с образцами CUDA SDK для АЭС, используют специальные распределители 2D-памяти, которые добавляют байты заполнения в конец каждой строки. Таким образом, первый пиксель каждой строки попадает на 64-байтовый выровненный адрес. Это сделано из соображений производительности (как на процессорах, так и на графических процессорах).

Массивы ядра, используемые для таких примитивов, как nppiFilter, должны быть плотно упакованы. Вот почему приведенный код не будет работать.

1

Для 1 канала (например, 32f_C1), этот подход работает:

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