АЭС CUDA без freeImage
Использует ли библиотека NPP для сборки CUDA только freeImage, или я могу использовать другую структуру или просто беззнаковое изображение char * в качестве входных данных в функции NPP.
Причина, по которой я задаю этот вопрос, заключается в том, что все образцы для АЭС имеют большие обертки для freeImage.
Я тщательно просмотрел NVIDIA Performance Primitives (NPP), но там упоминается только изображение, а не конкретный формат изображения.
Если у вас есть пример того, как использовать NPP без freeImage или просто без загрузки образа с диска, то я был бы очень рад.
1 ответ
NPP не зависит ни от FreeImage, ни от каких-либо конкретных соглашений библиотеки обработки изображений. Это просто следует общему соглашению, используемому в областях обработки изображений. Ожидается, что изображения будут храниться в основном порядке строк. Изображения обычно хранятся в виде линейной памяти. Поэтому функции NPP принимают в качестве аргументов указатель на необработанные данные изображения, хранящиеся на устройстве, размер изображения и шаг изображения.
В примерах NPP FreeImage просто используется как библиотека ввода-вывода изображения и для простоты обработки изображения на стороне хоста.
Я разрабатываю функции обработки изображений с использованием АЭС. Чтобы проверить функции, я использую OpenCV, чтобы прочитать изображение с диска, скопировать данные из IplImage
на необработанный указатель устройства и передать указатель на функцию NPP.
Вот пример использования NPP с OpenCV в качестве хоста.
#include <iostream>
#include <cuda_runtime.h>
#include <npp.h>
#include <opencv2/opencv.hpp>
using namespace std;
int main()
{
const int width = 640, height = 480;
//Create an 8 bit single channel image
IplImage* img = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
//Set All Image Pixels To 0
cvZero(img);
cvShowImage("Input",img);
cvWaitKey();
const int step = img->widthStep;
const int bytes = img->widthStep * img->height;
unsigned char *dSrc, *dDst;
cudaMalloc<unsigned char>(&dSrc,bytes);
cudaMalloc<unsigned char>(&dDst,bytes);
//Copy Data From IplImage to Device Pointer
cudaMemcpy(dSrc,img->imageData,bytes,cudaMemcpyHostToDevice);
NppiSize size;
size.width = width;
size.height = height;
const Npp8u value = 150;
//Call NPP function to add a constant value to each pixel of the image
nppiAddC_8u_C1RSfs(dSrc,step,value,dDst,step,size,1);
//Copy back the result from device to IplImage
cudaMemcpy(img->imageData,dDst,bytes,cudaMemcpyDeviceToHost);
cudaFree(dSrc);
cudaFree(dDst);
cvShowImage("Output",img);
cvWaitKey();
cvReleaseImage(&img);
return 0;
}